[svn] r6252: nemerle/trunk/ncc: hierarchy/GlobalEnv.n
misc/PrettyPrint.n parsing/MainParser.n parsing/Pars...
malekith
svnadmin at nemerle.org
Tue May 9 11:57:29 CEST 2006
Log:
Follow C# 3.0 spec -- hide extension methods from classes outside open namespaces.
Author: malekith
Date: Tue May 9 11:57:27 2006
New Revision: 6252
Added:
nemerle/trunk/ncc/testsuite/negative/extension-methods-hiding.n
Modified:
nemerle/trunk/ncc/hierarchy/GlobalEnv.n
nemerle/trunk/ncc/misc/PrettyPrint.n
nemerle/trunk/ncc/parsing/MainParser.n
nemerle/trunk/ncc/parsing/ParseTree.n
nemerle/trunk/ncc/parsing/Utility.n
nemerle/trunk/ncc/testsuite/positive/extension-methods.n
nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
nemerle/trunk/ncc/typing/Typer.n
Modified: nemerle/trunk/ncc/hierarchy/GlobalEnv.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/GlobalEnv.n (original)
+++ nemerle/trunk/ncc/hierarchy/GlobalEnv.n Tue May 9 11:57:27 2006
@@ -370,6 +370,11 @@
Operators)
}
+ public IsOpenNamespace (ns : NamespaceTree.Node) : bool
+ {
+ (current_namespace :: open_namespaces).Exists (_.Equals (ns))
+ }
+
internal EnterIntoNamespace (qid : list [string]) : GlobalEnv
{
mutable ns = current_namespace;
Modified: nemerle/trunk/ncc/misc/PrettyPrint.n
==============================================================================
--- nemerle/trunk/ncc/misc/PrettyPrint.n (original)
+++ nemerle/trunk/ncc/misc/PrettyPrint.n Tue May 9 11:57:27 2006
@@ -108,7 +108,7 @@
SprintExpr (ctx, e, indentation, acc);
add (")");
| Splicable.HalfId (n) =>
- add (n + "<COMPL>");
+ add (n.Id + "<COMPL>");
}
}
@@ -381,7 +381,7 @@
}
| PExpr.ToComplete (n) =>
- add (n + "<COMPL>");
+ add (n.Id + "<COMPL>");
| PExpr.Spliced (e) =>
add ("$("); SprintExpr (ctx, e, indentation, acc); add (")");
Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n (original)
+++ nemerle/trunk/ncc/parsing/MainParser.n Tue May 9 11:57:27 2006
@@ -416,7 +416,7 @@
match (tok) {
| Token.Identifier (n) => Splicable.Name (loc, mkname (n))
- | Token.IdentifierToComplete (pref) => Splicable.HalfId (loc, pref)
+ | Token.IdentifierToComplete (pref) => Splicable.HalfId (loc, mkname (pref))
| Token.Operator ("$") =>
def second = get_token ();
@@ -2087,7 +2087,7 @@
| Token.Identifier (i) => PExpr.Ref (loc, mkname (i))
- | Token.IdentifierToComplete (i) => PExpr.ToComplete (loc, i)
+ | Token.IdentifierToComplete (i) => PExpr.ToComplete (loc, mkname (i))
| Token.Keyword (k) =>
// here the expression syntax extensions are triggered, by first keyword
Modified: nemerle/trunk/ncc/parsing/ParseTree.n
==============================================================================
--- nemerle/trunk/ncc/parsing/ParseTree.n (original)
+++ nemerle/trunk/ncc/parsing/ParseTree.n Tue May 9 11:57:27 2006
@@ -292,7 +292,7 @@
parms : list [SyntaxElement]; }
| Quoted { body : SyntaxElement; }
| Spliced { body : PExpr; }
- | ToComplete { body : string; }
+ | ToComplete { body : Name; }
| Ellipsis { body : PExpr; }
| Typed { body : Typedtree.TExpr; }
| TypedPattern { body : Typedtree.Pattern; }
@@ -308,7 +308,7 @@
{
| Name { body : Parsetree.Name; }
| Expression { expr : PExpr; }
- | HalfId { prefix : string; }
+ | HalfId { prefix : Parsetree.Name; }
public GetName () : Parsetree.Name {
match (this) {
Modified: nemerle/trunk/ncc/parsing/Utility.n
==============================================================================
--- nemerle/trunk/ncc/parsing/Utility.n (original)
+++ nemerle/trunk/ncc/parsing/Utility.n Tue May 9 11:57:27 2006
@@ -119,8 +119,8 @@
match (e) {
| <[ $(x : name) ]> => Some ((x.idl :: acc, x))
| <[ $obj . $(fld : dyn) ]> => loop (obj, fld :: acc)
- | Member (obj, HalfId (fld)) => loop (obj, fld :: acc)
- | ToComplete (name) => Some (name :: acc, Parsetree.Name (name))
+ | Member (obj, HalfId (fld)) => loop (obj, fld.idl :: acc)
+ | ToComplete (name) => Some (name.Id :: acc, name)
| _ => None ()
}
};
Added: nemerle/trunk/ncc/testsuite/negative/extension-methods-hiding.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/ncc/testsuite/negative/extension-methods-hiding.n Tue May 9 11:57:27 2006
@@ -0,0 +1,5 @@
+#pragma indent
+// using Nemerle.Utility
+
+def a = array [1, 2]
+def b = a.ToList () // E: there is no member named `ToList' in array
Modified: nemerle/trunk/ncc/testsuite/positive/extension-methods.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/extension-methods.n (original)
+++ nemerle/trunk/ncc/testsuite/positive/extension-methods.n Tue May 9 11:57:27 2006
@@ -2,6 +2,8 @@
#pragma indent
using System.Console
using Nemerle.Collections
+using Nemerle.Utility
+using SomeDeepNamespace
using N1
namespace N1
Modified: nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-DelayedTyping.n (original)
+++ nemerle/trunk/ncc/typing/Typer-DelayedTyping.n Tue May 9 11:57:27 2006
@@ -85,7 +85,7 @@
[Record]
public variant Kind
{
- | MemberAccess { expr : TExpr; name : string; }
+ | MemberAccess { expr : TExpr; name : PT.Name; }
| Overloaded { overloads : list [OverloadPossibility]; }
| Operator { t1 : TyVar; t2 : TyVar; name : string; env : GlobalEnv; }
| Resolved { expr : TExpr; }
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Tue May 9 11:57:27 2006
@@ -1312,23 +1312,23 @@
TypeName (expression, expected)
else
if (messenger.InErrorMode) {
- def e = TryTyping (fun () { TypeMemberExpr (obj, mem_name, expected) });
+ def e = TryTyping (fun () { TypeMemberExpr (obj, name, expected) });
if (IsError (e))
TypeName (expression, expected)
else
- TypeMemberExpr (obj, mem_name, expected)
+ TypeMemberExpr (obj, name, expected)
} else
- TypeMemberExpr (obj, mem_name, expected)
+ TypeMemberExpr (obj, name, expected)
} else
- TypeMemberExpr (obj, mem_name, expected)
+ TypeMemberExpr (obj, name, expected)
| e => e
}
else
- TypeMemberExpr (TypeExpr (obj), mem_name, expected)
+ TypeMemberExpr (TypeExpr (obj), name, expected)
- | PT.PExpr.Member (obj, PT.Splicable.HalfId (mem_name)) =>
+ | PT.PExpr.Member (obj, PT.Splicable.HalfId (name)) =>
def skip_name =
! CanBeTypeName (obj) ||
try {
@@ -1344,20 +1344,20 @@
TypeNameFull (expression, expected, for_completion = true);
def member_overloads =
- match (TypeMember (TypeExpr (obj), mem_name, expected,
+ match (TypeMember (TypeExpr (obj), name, expected,
for_completion = true)) {
| Some (lst)
| None with lst = [] => lst
}
- throw CompletionResult (member_overloads + name_overloads, mem_name)
+ throw CompletionResult (member_overloads + name_overloads, name.Id)
| PT.PExpr.ToComplete (name) =>
// FIXME: check locals first
def overloads =
TypeNameFull (expression, expected, for_completion = true);
- throw CompletionResult (overloads, name)
+ throw CompletionResult (overloads, name.Id)
| PT.PExpr.Member (_, _) =>
@@ -2225,16 +2225,16 @@
}
- TypeMemberExpr (obj : TExpr, mem_name : string, expected : TyVar) : TExpr
+ TypeMemberExpr (obj : TExpr, name : PT.Name, expected : TyVar) : TExpr
{
- match (TypeMember (obj, mem_name, expected)) {
+ match (TypeMember (obj, name, expected)) {
| Some ([]) =>
if (Completion.Engine.IsInCompletionMode) {
TExpr.Error()
}
else
{
- ReportError (messenger, $ "there is no member named `$(mem_name)' "
+ ReportError (messenger, $ "there is no member named `$(name.Id)' "
"in $(TypeOf (obj)) with type $expected");
TExpr.Error ()
}
@@ -2242,14 +2242,15 @@
| Some (lst) =>
MakeOverloadedNode (lst, expected)
| None =>
- Delay (DelayedTyping.Kind.MemberAccess (obj, mem_name), expected)
+ Delay (DelayedTyping.Kind.MemberAccess (obj, name), expected)
}
}
- TypeMember (obj : TExpr, mem_name : string, expected : TyVar, for_completion = false)
+ TypeMember (obj : TExpr, name : PT.Name, expected : TyVar, for_completion = false)
: option [list [OverloadPossibility]]
{
+ def mem_name = name.Id;
// XXX we should add a bound here, that the type should have the
// field mem_name
def possible_type =
@@ -2332,6 +2333,17 @@
lookup (possible_type);
}
+ res = res.Filter (fun (_) {
+ | OverloadPossibility where (Member = meth is IMethod)
+ when meth.IsExtensionMethod =>
+ match (meth.BuiltinKind) {
+ | ExtensionMethod (impl) =>
+ name.GetEnv (env).IsOpenNamespace (impl.DeclaringType.NamespaceNode.Parent)
+ | _ => Util.ice ()
+ }
+ | _ => true
+ });
+
Some (res)
}
else if (IsError (obj))
@@ -2435,12 +2447,12 @@
def res =
try {
solver.PushState ();
- Option.UnSome (TypeMember (This (), name.Id, expected));
+ Option.UnSome (TypeMember (This (), name, expected));
} finally {
solver.PopState ();
}
if (res.IsEmpty) []
- else Option.UnSome (TypeMember (This (), name.Id, expected))
+ else Option.UnSome (TypeMember (This (), name, expected))
| _ => []
};
More information about the svn
mailing list