瀏覽代碼

Improve error diagnostic.

Vladislav Folts 11 年之前
父節點
當前提交
7c63179c80

二進制
bin/compiled.zip


+ 1 - 1
src/context.js

@@ -1950,7 +1950,7 @@ exports.Context = Class.extend({
             var s = scope.findSymbol(ident);
 
             if (s)
-                return Symbol.makeFound(s, scope);
+                return s;
         }
         return undefined;
     },

+ 8 - 5
src/eberon/EberonScope.ob

@@ -5,13 +5,16 @@ TYPE
         parent: Scope.PType
     END;
 
+PROCEDURE Operator.name(): STRING;
+    RETURN "operator"
+END Operator.name;
+
 PROCEDURE Operator.addSymbol(s: Symbols.PSymbol; exported: BOOLEAN);
-VAR
-    id: STRING;
 BEGIN
-    id := s.id();
-    IF SELF.parent.findSymbol(id) # NIL THEN
-        Errors.raise("'" + id + "' already declared in procedure scope");
+    id <- s.id();
+    found <- SELF.parent.findSymbol(id);
+    IF found # NIL THEN
+        Errors.raise("'" + id + "' already declared in " + found.scope().name() + " scope");
     END;
     SUPER(s, exported);
 END Operator.addSymbol;

+ 19 - 5
src/ob/Scope.ob

@@ -1,6 +1,7 @@
 MODULE Scope;
 IMPORT 
     Errors, 
+    JS,
     JsArray, 
     JsMap, 
     Object, 
@@ -11,7 +12,7 @@ IMPORT
 TYPE
     Type* = RECORD(ScopeBase.Type)
         PROCEDURE addSymbol*(s: Symbols.PSymbol; exported: BOOLEAN);
-        PROCEDURE findSymbol*(id: STRING): Symbols.PSymbol;
+        PROCEDURE findSymbol*(id: STRING): Symbols.PFoundSymbol;
         PROCEDURE close();
 
         stdSymbols: JsMap.Type;
@@ -180,17 +181,26 @@ BEGIN
     JsMap.put(SELF.symbols, id, s);
 END Type.addSymbol;
 
-PROCEDURE Type.findSymbol(id: STRING): Symbols.PSymbol;
+PROCEDURE Type.findSymbol(id: STRING): Symbols.PFoundSymbol;
 VAR
     result: Object.PType;
-    void: BOOLEAN;
+    found: Symbols.PFoundSymbol;
+    pSelf: PType;
 BEGIN
     IF ~JsMap.find(SELF.symbols, id, result) THEN
-        void := JsMap.find(SELF.stdSymbols, id, result);
+        void <- JsMap.find(SELF.stdSymbols, id, result);
     END;
-    RETURN result(Symbols.PSymbol)
+    IF result # NIL THEN
+        JS.do("pSelf = this");
+        found := Symbols.makeFound(result(Symbols.PSymbol), pSelf)
+    END;
+    RETURN found
 END Type.findSymbol;
 
+PROCEDURE Procedure.name(): STRING;
+    RETURN "procedure"
+END Procedure.name;
+
 PROCEDURE Procedure.addSymbol(s: Symbols.PSymbol; exported: BOOLEAN);
 VAR
     info: Types.PId;
@@ -241,6 +251,10 @@ BEGIN
     RETURN result
 END CompiledModule.findSymbol;
 
+PROCEDURE Module.name(): STRING;
+    RETURN "module"
+END Module.name;
+
 PROCEDURE Module.addSymbol(s: Symbols.PSymbol; exported: BOOLEAN);
 BEGIN
     SUPER(s, exported);

+ 1 - 0
src/ob/ScopeBase.ob

@@ -4,6 +4,7 @@ TYPE
     FinalizerProc* = PROCEDURE(closure: Object.PType);
 
     Type* = RECORD
+        PROCEDURE name*(): STRING;
         PROCEDURE addFinalizer*(finalizer: FinalizerProc; closure: Object.PType)
     END;
     PType* = POINTER TO Type;

+ 1 - 1
src/ob/Symbols.ob

@@ -18,7 +18,7 @@ TYPE
 
     FoundSymbol* = RECORD
         PROCEDURE symbol(): PSymbol;
-        PROCEDURE scope(): ScopeBase.PType;
+        PROCEDURE scope*(): ScopeBase.PType;
 
         mSymbol: PSymbol;
         mScope: ScopeBase.PType

+ 1 - 0
test/expected/eberon/errors/in_place_variable_has_the_same_scope_as_module_variable.txt

@@ -0,0 +1 @@
+line 4: 'i' already declared in module scope

+ 5 - 0
test/input/eberon/errors/in_place_variable_has_the_same_scope_as_module_variable.ob

@@ -0,0 +1,5 @@
+MODULE m1;
+VAR i: INTEGER;
+BEGIN
+    FOR i <- 1 TO 10 END;
+END m1.

+ 3 - 1
test/test_compile.js

@@ -145,6 +145,7 @@ function main(){
     var nodejsDirs = makeTestDirs("nodejs");
     var eberonDirs = makeTestDirs("eberon");
     var eberonRunDirs = makeTestDirs("eberon/run");
+    var eberonErrDirs = makeTestDirs("eberon/errors");
 
     function makeCommonTests(language, subdir){
         return {
@@ -160,7 +161,8 @@ function main(){
                              "eberon": makeCommonTests(eberon, "eberon")
                             },
                   "eberon": {"expect OK": makeTests(expectOk, eberonDirs, eberon),
-                             "run": makeTests(run, eberonRunDirs, eberon)
+                             "run": makeTests(run, eberonRunDirs, eberon),
+                             "expect compile error": makeTests(expectError, eberonErrDirs, eberon)
                             }
                  });
     return result ? 0 : -1;

+ 1 - 1
test/test_unit_eberon.js

@@ -453,7 +453,7 @@ exports.suite = {
              ["PROCEDURE p(); BEGIN i <- 0; IF FALSE THEN i <- 0; END; END p;",
               "'i' already declared in procedure scope"],
              ["PROCEDURE p(); BEGIN WHILE FALSE DO i <- 0; WHILE FALSE DO i <- 0; END; END; END p;",
-              "'i' already declared in procedure scope"]
+              "'i' already declared in operator scope"]
             )
         ),
     "type promotion in expression": testWithContext(