Browse Source

UnknownVar => ExternallyKnownVar

Herby Vojčík 4 years ago
parent
commit
9a35214ee6

+ 9 - 0
lang/API-CHANGES.txt

@@ -1,6 +1,7 @@
 0.24.1:
 
 * Deprecate Behavior >> javascriptConstructor(:)
+* UnknownVar => ExternallyKnownVar
 
 + Behavior >>
   + alternateConstructorViaSelector:
@@ -10,8 +11,12 @@
   + javaScriptConstructor:
 + BlockClosure >>
   + tryIfTrue:catch:
++ ExternallyKnownVar >>
+  + isExternallyKnownVar
 + SemanticAnalyzer >>
   + isVariableKnown:inPackage:
++ ScopeVar >>
+  + isExternallyKnownVar
 + SequenceableCollection >>
   + copyWithFirst:
 + SmalltalkImage >>
@@ -33,11 +38,15 @@
   - stubToAtMost:
 - MethodLexicalScope >>
   - unknownVariables
+- ScopeVar >>
+  - isUnknownVar
 - SemanticAnalyzer >>
   - isVariableUndefined:inPackage:
 - SendNode >>
   - shouldBeInlined
   - shouldBeInlined:
+- UnknownVar >>
+  - isUnknownVar
 - amber/boot api >>
   - addElement(arraySet, el)
   - removeElement(arraySet, el)

+ 3 - 3
lang/src/Compiler-Interpreter.js

@@ -3404,11 +3404,11 @@ selector: "visitVariableNode:",
 protocol: "visiting",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aNode"],
-source: "visitVariableNode: aNode\x0a\x09aNode binding isUnknownVar ifTrue: [\x0a\x09\x09^ self push: (Platform globals at: aNode value ifAbsent: [ self error: 'Unknown variable' ]) ].\x0a\x09\x09\x0a\x09self push: (aNode binding isInstanceVar\x0a\x09\x09ifTrue: [ self context receiver instVarAt: aNode value ]\x0a\x09\x09ifFalse: [ self context \x0a\x09\x09\x09localAt: (aNode binding isSuper ifTrue: [ 'self' ] ifFalse: [ aNode value ])\x0a\x09\x09\x09ifAbsent: [\x0a\x09\x09\x09\x09aNode value isCapitalized\x0a\x09\x09\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09\x09\x09Smalltalk globals \x0a\x09\x09\x09\x09\x09\x09\x09at: aNode value \x0a\x09\x09\x09\x09\x09\x09\x09ifAbsent: [ Platform globals at: aNode value ] ] ] ])",
+source: "visitVariableNode: aNode\x0a\x09aNode binding isExternallyKnownVar ifTrue: [\x0a\x09\x09^ self push: (Platform globals at: aNode value ifAbsent: [ self error: 'Unknown variable' ]) ].\x0a\x09\x09\x0a\x09self push: (aNode binding isInstanceVar\x0a\x09\x09ifTrue: [ self context receiver instVarAt: aNode value ]\x0a\x09\x09ifFalse: [ self context \x0a\x09\x09\x09localAt: (aNode binding isSuper ifTrue: [ 'self' ] ifFalse: [ aNode value ])\x0a\x09\x09\x09ifAbsent: [\x0a\x09\x09\x09\x09aNode value isCapitalized\x0a\x09\x09\x09\x09\x09ifTrue: [\x0a\x09\x09\x09\x09\x09\x09Smalltalk globals \x0a\x09\x09\x09\x09\x09\x09\x09at: aNode value \x0a\x09\x09\x09\x09\x09\x09\x09ifAbsent: [ Platform globals at: aNode value ] ] ] ])",
 referencedClasses: ["Platform", "Smalltalk"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["ifTrue:", "isUnknownVar", "binding", "push:", "at:ifAbsent:", "globals", "value", "error:", "ifTrue:ifFalse:", "isInstanceVar", "instVarAt:", "receiver", "context", "localAt:ifAbsent:", "isSuper", "isCapitalized", "at:"]
+messageSends: ["ifTrue:", "isExternallyKnownVar", "binding", "push:", "at:ifAbsent:", "globals", "value", "error:", "ifTrue:ifFalse:", "isInstanceVar", "instVarAt:", "receiver", "context", "localAt:ifAbsent:", "isSuper", "isCapitalized", "at:"]
 }, function ($methodClass){ return function (aNode){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -3419,7 +3419,7 @@ $2=$recv(aNode)._binding();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["binding"]=1;
 //>>excludeEnd("ctx");
-$1=$recv($2)._isUnknownVar();
+$1=$recv($2)._isExternallyKnownVar();
 if($core.assert($1)){
 $5=$recv($globals.Platform)._globals();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);

+ 1 - 1
lang/src/Compiler-Interpreter.st

@@ -887,7 +887,7 @@ visitValueNode: aNode
 !
 
 visitVariableNode: aNode
-	aNode binding isUnknownVar ifTrue: [
+	aNode binding isExternallyKnownVar ifTrue: [
 		^ self push: (Platform globals at: aNode value ifAbsent: [ self error: 'Unknown variable' ]) ].
 		
 	self push: (aNode binding isInstanceVar

+ 41 - 41
lang/src/Compiler-Semantic.js

@@ -1115,11 +1115,11 @@ $globals.ScopeVar);
 
 $core.addMethod(
 $core.method({
-selector: "isImmutable",
+selector: "isExternallyKnownVar",
 protocol: "testing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "isImmutable\x0a\x09^ false",
+source: "isExternallyKnownVar\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
@@ -1133,11 +1133,11 @@ $globals.ScopeVar);
 
 $core.addMethod(
 $core.method({
-selector: "isInstanceVar",
+selector: "isImmutable",
 protocol: "testing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "isInstanceVar\x0a\x09^ false",
+source: "isImmutable\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
@@ -1151,11 +1151,11 @@ $globals.ScopeVar);
 
 $core.addMethod(
 $core.method({
-selector: "isPseudoVar",
+selector: "isInstanceVar",
 protocol: "testing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "isPseudoVar\x0a\x09^ false",
+source: "isInstanceVar\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
@@ -1169,11 +1169,11 @@ $globals.ScopeVar);
 
 $core.addMethod(
 $core.method({
-selector: "isSelf",
+selector: "isPseudoVar",
 protocol: "testing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "isSelf\x0a\x09^ false",
+source: "isPseudoVar\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
@@ -1187,11 +1187,11 @@ $globals.ScopeVar);
 
 $core.addMethod(
 $core.method({
-selector: "isSuper",
+selector: "isSelf",
 protocol: "testing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "isSuper\x0a\x09^ false",
+source: "isSelf\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
@@ -1205,11 +1205,11 @@ $globals.ScopeVar);
 
 $core.addMethod(
 $core.method({
-selector: "isTempVar",
+selector: "isSuper",
 protocol: "testing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "isTempVar\x0a\x09^ false",
+source: "isSuper\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
@@ -1223,11 +1223,11 @@ $globals.ScopeVar);
 
 $core.addMethod(
 $core.method({
-selector: "isUnknownVar",
+selector: "isTempVar",
 protocol: "testing",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "isUnknownVar\x0a\x09^ false",
+source: "isTempVar\x0a\x09^ false",
 referencedClasses: [],
 //>>excludeEnd("ide");
 pragmas: [],
@@ -1547,6 +1547,30 @@ $globals.ClassRefVar);
 
 
 
+$core.addClass("ExternallyKnownVar", $globals.ScopeVar, [], "Compiler-Semantic");
+//>>excludeStart("ide", pragmas.excludeIdeData);
+$globals.ExternallyKnownVar.comment="I am a variable known externally (not in method scope).";
+//>>excludeEnd("ide");
+$core.addMethod(
+$core.method({
+selector: "isExternallyKnownVar",
+protocol: "testing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "isExternallyKnownVar\x0a\x09^ true",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: []
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+return true;
+
+}; }),
+$globals.ExternallyKnownVar);
+
+
+
 $core.addClass("InstanceVar", $globals.ScopeVar, [], "Compiler-Semantic");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.InstanceVar.comment="I am an instance variable of a method or block.";
@@ -1843,30 +1867,6 @@ $globals.TempVar);
 
 
 
-$core.addClass("UnknownVar", $globals.ScopeVar, [], "Compiler-Semantic");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.UnknownVar.comment="I am an unknown variable. Amber uses unknown variables as JavaScript globals";
-//>>excludeEnd("ide");
-$core.addMethod(
-$core.method({
-selector: "isUnknownVar",
-protocol: "testing",
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "isUnknownVar\x0a\x09^ true",
-referencedClasses: [],
-//>>excludeEnd("ide");
-pragmas: [],
-messageSends: []
-}, function ($methodClass){ return function (){
-var self=this,$self=this;
-return true;
-
-}; }),
-$globals.UnknownVar);
-
-
-
 $core.addClass("SemanticAnalyzer", $globals.NodeVisitor, ["currentScope", "blockIndex", "thePackage", "theClass", "classReferences", "messageSends"], "Compiler-Semantic");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.SemanticAnalyzer.comment="I semantically analyze the abstract syntax tree and annotate it with informations such as non local returns and variable scopes.";
@@ -1877,8 +1877,8 @@ selector: "bindUnscopedVariable:",
 protocol: "private",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aString"],
-source: "bindUnscopedVariable: aString\x0a\x09aString isCapitalized ifTrue: [ \x22Capital letter variables might be globals.\x22\x0a\x09\x09self classReferences add: aString.\x0a\x09\x09^ ClassRefVar new name: aString; yourself ].\x0a\x0a\x09\x22Throw an error if the variable is undeclared in the global JS scope (i.e. window).\x0a\x09We allow all variables listed by Smalltalk>>#globalJsVariables.\x0a\x09This list includes: `window`, `document`,  `process` and `global`\x0a\x09for nodejs and browser environments.\x0a\x09\x0a\x09This is only to make sure compilation works on both browser-based and nodejs environments.\x0a\x09The ideal solution would be to use a pragma instead\x22\x0a\x0a\x09((Smalltalk globalJsVariables includes: aString)\x0a\x09\x09or: [ self isVariableKnown: aString inPackage: self thePackage ]) ifTrue: [\x0a\x09\x09\x09^ UnknownVar new name: aString; yourself ].\x0a\x0a\x09self errorUnknownVariable: aString",
-referencedClasses: ["ClassRefVar", "Smalltalk", "UnknownVar"],
+source: "bindUnscopedVariable: aString\x0a\x09aString isCapitalized ifTrue: [ \x22Capital letter variables might be globals.\x22\x0a\x09\x09self classReferences add: aString.\x0a\x09\x09^ ClassRefVar new name: aString; yourself ].\x0a\x0a\x09\x22Throw an error if the variable is undeclared in the global JS scope (i.e. window).\x0a\x09We allow all variables listed by Smalltalk>>#globalJsVariables.\x0a\x09This list includes: `window`, `document`,  `process` and `global`\x0a\x09for nodejs and browser environments.\x0a\x09\x0a\x09This is only to make sure compilation works on both browser-based and nodejs environments.\x0a\x09The ideal solution would be to use a pragma instead\x22\x0a\x0a\x09((Smalltalk globalJsVariables includes: aString)\x0a\x09\x09or: [ self isVariableKnown: aString inPackage: self thePackage ]) ifTrue: [\x0a\x09\x09\x09^ ExternallyKnownVar new name: aString; yourself ].\x0a\x0a\x09self errorUnknownVariable: aString",
+referencedClasses: ["ClassRefVar", "Smalltalk", "ExternallyKnownVar"],
 //>>excludeEnd("ide");
 pragmas: [],
 messageSends: ["ifTrue:", "isCapitalized", "add:", "classReferences", "name:", "new", "yourself", "or:", "includes:", "globalJsVariables", "isVariableKnown:inPackage:", "thePackage", "errorUnknownVariable:"]
@@ -1915,7 +1915,7 @@ return $self._isVariableKnown_inPackage_(aString,$self._thePackage());
 //>>excludeEnd("ctx");
 }));
 if($core.assert($4)){
-$5=$recv($globals.UnknownVar)._new();
+$5=$recv($globals.ExternallyKnownVar)._new();
 $recv($5)._name_(aString);
 return $recv($5)._yourself();
 }

+ 17 - 17
lang/src/Compiler-Semantic.st

@@ -244,6 +244,10 @@ isClassRefVar
 	^ false
 !
 
+isExternallyKnownVar
+	^ false
+!
+
 isImmutable
 	^ false
 !
@@ -268,10 +272,6 @@ isTempVar
 	^ false
 !
 
-isUnknownVar
-	^ false
-!
-
 validateAssignment
 	(self isArgVar or: [ self isPseudoVar ]) ifTrue: [
 		InvalidAssignmentError new
@@ -347,6 +347,18 @@ isImmutable
 	^ true
 ! !
 
+ScopeVar subclass: #ExternallyKnownVar
+	slots: {}
+	package: 'Compiler-Semantic'!
+!ExternallyKnownVar commentStamp!
+I am a variable known externally (not in method scope).!
+
+!ExternallyKnownVar methodsFor: 'testing'!
+
+isExternallyKnownVar
+	^ true
+! !
+
 ScopeVar subclass: #InstanceVar
 	slots: {}
 	package: 'Compiler-Semantic'!
@@ -452,18 +464,6 @@ isTempVar
 	^ true
 ! !
 
-ScopeVar subclass: #UnknownVar
-	slots: {}
-	package: 'Compiler-Semantic'!
-!UnknownVar commentStamp!
-I am an unknown variable. Amber uses unknown variables as JavaScript globals!
-
-!UnknownVar methodsFor: 'testing'!
-
-isUnknownVar
-	^ true
-! !
-
 NodeVisitor subclass: #SemanticAnalyzer
 	slots: {#currentScope. #blockIndex. #thePackage. #theClass. #classReferences. #messageSends}
 	package: 'Compiler-Semantic'!
@@ -543,7 +543,7 @@ bindUnscopedVariable: aString
 
 	((Smalltalk globalJsVariables includes: aString)
 		or: [ self isVariableKnown: aString inPackage: self thePackage ]) ifTrue: [
-			^ UnknownVar new name: aString; yourself ].
+			^ ExternallyKnownVar new name: aString; yourself ].
 
 	self errorUnknownVariable: aString
 !