[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