2
0
Vladislav Folts 11 жил өмнө
parent
commit
17b402aaa2

BIN
bin/compiled.zip


+ 14 - 3
src/eberon/EberonScope.ob

@@ -4,6 +4,7 @@ TYPE
     Operator = RECORD(Scope.Type)
         parent: Scope.PType
     END;
+    POperator = POINTER TO Operator;
 
 PROCEDURE Operator.name(): STRING;
     RETURN "operator"
@@ -12,9 +13,19 @@ END Operator.name;
 PROCEDURE Operator.addSymbol(s: Symbols.PSymbol; exported: BOOLEAN);
 BEGIN
     id <- s.id();
-    found <- SELF.parent.findSymbol(id);
-    IF found # NIL THEN
-        Errors.raise("'" + id + "' already declared in " + found.scope().name() + " scope");
+    parent <- SELF.parent;
+    WHILE parent # NIL DO
+        found <- parent.findSymbol(id);
+        IF found # NIL THEN
+            Errors.raise("'" + id + "' already declared in " + found.scope().name() + " scope");
+        END;
+
+        next <- parent;
+        IF next IS POperator THEN
+            parent := next.parent;
+        ELSE
+            parent := NIL;
+        END;
     END;
     SUPER(s, exported);
 END Operator.addSymbol;

+ 1 - 1
src/eberon/eberon_context.js

@@ -985,7 +985,7 @@ var OperatorScopes = Class.extend({
         if (this.__scope)
             this.__context.popScope();
         this.__scope = EberonScope.makeOperator(
-            this.__context.parent().currentScope(),
+            this.__context.currentScope(),
             this.__context.language().stdSymbols);
         this.__context.pushScope(this.__scope);
 

+ 2 - 0
test/test_unit_eberon.js

@@ -482,6 +482,8 @@ exports.suite = {
               "'v' already declared in procedure scope"],
              ["PROCEDURE p(); BEGIN i <- 0; IF FALSE THEN i <- 0; END; END p;",
               "'i' already declared in procedure scope"],
+             ["PROCEDURE p(); BEGIN i <- 0; IF TRUE THEN IF TRUE THEN i <- 0; END; 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 operator scope"]
             )