[svn] r6866: nemerle/trunk/ncc/parsing/MainParser.n

VladD2 svnadmin at nemerle.org
Sat Nov 11 16:26:42 CET 2006


Log:
Fix location of operator call.

Author: VladD2
Date: Sat Nov 11 16:26:40 2006
New Revision: 6866

Modified:
   nemerle/trunk/ncc/parsing/MainParser.n

Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n	(original)
+++ nemerle/trunk/ncc/parsing/MainParser.n	Sat Nov 11 16:26:40 2006
@@ -68,7 +68,7 @@
       public LeftPriority : int;
       public RightPriority : int;
 
-      public static RoundInfo : OperatorInfo = OperatorInfo ("(", 290,291);
+      public static RoundInfo   : OperatorInfo = OperatorInfo      ("(", 290, 291);
       public static SquareInfo : OperatorInfo = OperatorInfo ("[", 290, 291);
       public static ProductInfo : OperatorInfo = OperatorInfo ("*", 261, 260);
       public static UnMinus : OperatorInfo = UnaryOperatorInfo ("-", 281, 280);
@@ -88,10 +88,15 @@
     }
 
     class NaryOperatorInfo : OperatorInfo {
+      public this (copy : OperatorInfo, location : Location) {
+        base (copy.Name, copy.LeftPriority, copy.RightPriority);
+        Location = location;
+      }
       public this (copy : OperatorInfo) {
         base (copy.Name, copy.LeftPriority, copy.RightPriority);
       }
 
+      public mutable Location   : Location;
       public mutable ExprsBegin : list [PExpr];
     }
 
@@ -1568,13 +1573,14 @@
       PExpr.Call (e.Location, PExpr.Ref (e.Location, mkname (name)), [e])
     }
     
-    make_operator_call (name : string, parms : list [PExpr]) : PExpr
+    make_operator_call (name : string, parms : list [PExpr], location : Location) : PExpr
     {
-      def head = List.Head (parms);
-      def loc = head.Location + last_tok.Location;
+      def loc = if (location.FileIndex == 0) parms.Head.Location + parms.Last.Location
+                else location;
+
       match (name) {
-        | "(" => PExpr.Call (loc, head, List.Tail (parms))
-        | "[" => PExpr.Indexer (loc, head, List.Tail (parms))
+        | "(" => PExpr.Call (loc, parms.Head, parms.Tail)
+        | "[" => PExpr.Indexer (loc, parms.Head, parms.Tail)
         | _ => PExpr.Call (loc, PExpr.Ref (loc, mkname (name)), parms)
       }
     }
@@ -1608,7 +1614,7 @@
                 match (x) {
                   | nary is NaryOperatorInfo =>
                     def parms = roll_exprs (ref exprs, nary.ExprsBegin);
-                    make_operator_call (x.Name, parms)
+                    make_operator_call (x.Name, parms, nary.Location)
                     
                   | _ is BinaryOperatorInfo =>
                     match (exprs) {
@@ -1720,11 +1726,17 @@
 
               | Token.SquareGroup (g)  =>
                 group = g;                
+                if (g == null)
                 NaryOperatorInfo (OperatorInfo.SquareInfo);
+                else
+                  NaryOperatorInfo (OperatorInfo.SquareInfo, g.Location);
 
               | Token.RoundGroup (g) =>
                 group = g;
+                if (g == null)
                 NaryOperatorInfo (OperatorInfo.RoundInfo);
+                else
+                  NaryOperatorInfo (OperatorInfo.RoundInfo, g.Location);
 
               | _ => null
             }



More information about the svn mailing list