#BUGFIX by stefan
authorStefan Vogel <sv@exept.de>
Mon, 12 Dec 2016 16:38:47 +0100
changeset 4080 08869106d07e
parent 4079 ce26f968865a
child 4081 b65591a618fd
child 4082 7d87a1910e3d
#BUGFIX by stefan class: Parser comment/format in: #checkSelector:for:inClass: changed: #selectorCheck:for:positions: avoid symbol creation better message if method selector is totally unknown
Parser.st
--- a/Parser.st	Mon Dec 12 15:15:45 2016 +0100
+++ b/Parser.st	Mon Dec 12 16:38:47 2016 +0100
@@ -2914,7 +2914,7 @@
                 ]
             ]
         ] ifFalse:[
-            (mthd sendsAny:#( #subclassResponsibility #subclassResponsibility: )) ifTrue:[
+            (mthd sendsAny:#(subclassResponsibility subclassResponsibility:)) ifTrue:[
                 allowed := (cls == classToCompileFor).      "methods in abstract classes may send messages to abstract methods in the same class"
                 allowed ifFalse:[
                     "methods in abstract classes may send messages to abstract methods in meta class"
@@ -4214,7 +4214,7 @@
                         checkAction:[:e |
                             |m|
                             (m := e problemMethod) notNil
-                            and:[(m sends:aSelectorString asSymbol)
+                            and:[(m sends:aSelectorString asSymbolIfInterned)
                             and:[self class implementedInAnyClass:aSelectorString]] ]
                 ].
             ].
@@ -4250,72 +4250,64 @@
 
                             selClass := self typeOfNode:receiver.
                             (m := e problemMethod) notNil
-                            and:[(m sends:aSelectorString asSymbol)
-                            and:[(self checkSelector:selectorSymbol for:receiver inClass:selClass) notNil]]].
+                            and:[(m sends:aSelectorString asSymbolIfInterned)
+                            and:[(self checkSelector:aSelectorString for:receiver inClass:selClass) notNil]]].
                 ].
             ].
         ].
 
-        (receiver isConstant or:[receiver isBlock]) ifTrue:[
-            err notNil ifTrue:[
+        nowhereImplemented ifFalse:[
+            (receiver isConstant or:[receiver isBlock]) ifTrue:[
                 err := err, ' in ' , selClass name , ' or any of its superclasses'.
-            ].
-        ] ifFalse:[(((recType := receiver type) == #GlobalVariable)
-                    or:[recType == #PrivateClass]) ifTrue:[
-            rec := receiver evaluate.
-            "/ don't check autoloaded classes - it may work after loading
-            (rec isNil
-             or:[rec isBehavior and:[rec isLoaded not]]) ifTrue:[
-                ^ aSelectorString
-            ].
-
-            err notNil ifTrue:[
+            ] ifFalse:[(((recType := receiver type) == #GlobalVariable)
+                        or:[recType == #PrivateClass]) ifTrue:[
+                rec := receiver evaluate.
+                "/ don't check autoloaded classes - it may work after loading
+                (rec isNil
+                 or:[rec isBehavior and:[rec isLoaded not]]) ifTrue:[
+                    ^ aSelectorString
+                ].
+
                 (rec isBehavior
                  and:[rec theNonMetaclass name = receiver name]) ifTrue:[
                     err := err, ' in ' , rec theNonMetaclass name.
                 ] ifFalse:[
                     err := err, ' in currently assigned value (is currently ' , rec classNameWithArticle , ')'.
-                ]
-            ].
-        ] ifFalse:[receiver isSuper ifTrue:[
-            receiver isHere ifFalse:[
-                err notNil ifTrue:[
-                    err := err, ' in superclass chain'.
-                ].
-            ] ifTrue:[
-                err notNil ifTrue:[
-                    err := err, ' in this class or superclass chain'.
                 ].
-            ]
-        ] ifFalse:[receiver isSelf ifTrue:[
-            err notNil ifTrue:[
-                |subErr nOther|
-
-                "/ understood by all subclasses ?
-                nOther := 0.
-                classToCompileFor allSubclassesDo:[:eachSubclass |
-                    subErr isNil ifTrue:[
-                        selClass := eachSubclass.
-                        subErr := self checkSelector:selectorSymbol for:receiver inClass:selClass.
+            ] ifFalse:[receiver isSuper ifTrue:[
+                receiver isHere ifFalse:[
+                    err := err, ' in superclass chain'.
+                ] ifTrue:[
+                    err := err, ' in this class or superclass chain'.
+                ]
+            ] ifFalse:[receiver isSelf ifTrue:[
+                err notNil ifTrue:[
+                    |subErr nOther|
+
+                    "/ understood by all subclasses ?
+                    nOther := 0.
+                    classToCompileFor allSubclassesDo:[:eachSubclass |
+                        subErr isNil ifTrue:[
+                            selClass := eachSubclass.
+                            subErr := self checkSelector:selectorSymbol for:receiver inClass:selClass.
+                        ] ifFalse:[
+                            (self checkSelector:selectorSymbol for:receiver inClass:selClass) notNil ifTrue:[ nOther := nOther + 1 ].
+                        ]
+                    ].
+                    subErr notNil ifTrue:[
+                        nOther > 0 ifTrue:[
+                            err := subErr, (' in %1 other subclass(es), this class or superclass chain' bindWith:nOther)
+                        ] ifFalse:[
+                            err := subErr, ', in this class or superclass chain'
+                        ].
                     ] ifFalse:[
-                        (self checkSelector:selectorSymbol for:receiver inClass:selClass) notNil ifTrue:[ nOther := nOther + 1 ].
-                    ]
+                        err := err, ', in this class or superclass chain'.
+                    ].
                 ].
-                subErr notNil ifTrue:[
-                    nOther > 0 ifTrue:[
-                        err := subErr, (' in %1 other subclass(es), this class or superclass chain' bindWith:nOther)
-                    ] ifFalse:[
-                        err := subErr, ', in this class or superclass chain'
-                    ].
-                ] ifFalse:[
-                    err := err, ', in this class or superclass chain'.
-                ].
-            ].
-        ] ifFalse:[(receiver isUnaryMessage
-                    and:[receiver selector == #class
-                    and:[receiver receiver isSelf]]) ifTrue:[
-            "it's a message to self class - can check this too ..."
-            err notNil ifTrue:[
+            ] ifFalse:[(receiver isUnaryMessage
+                        and:[receiver selector == #class
+                        and:[receiver receiver isSelf]]) ifTrue:[
+                "it's a message to self class - can check this too ..."
                 classToCompileFor isMeta ifTrue:[
                     err := err, ' for the classes class'.
                     (self checkSelector:selectorSymbol for:receiver inClass:classToCompileFor) isNil ifTrue:[
@@ -4329,46 +4321,46 @@
                         err := err withCRs.
                     ].
                 ].
-            ].
-        ] ifFalse:[
-            (self isPossiblyUninitializedLocal:receiver) ifTrue:[
-"/ (receiver isLocal and:[receiver token type isNil]) ifTrue:[
-                "if it is an uninitialized variable ..."
-
-"/                ((modifiedLocalVars isNil or:[(modifiedLocalVars includes:receiver name) not])
-"/                 and:[hasPrimitiveCode not
-"/                 and:[((receiver isMethodVariable and:[currentBlock isNil])
-"/                      or:[ receiver isBlockVariable and:[receiver block == currentBlock]])
-"/                 and:[alreadyWarnedUninitializedVars isNil
-"/                      or:[(alreadyWarnedUninitializedVars includes:receiver name) not]]]])
-"/                ifTrue:[
-                ((#(at: at:put: basicAt: basicAt:put:) includes:selectorSymbol)
-                 or:[(nil respondsTo:selectorSymbol) not]) ifTrue:[
-                    "/ avoid trouble in miniTalk
-                    "/ during bootstrap
-                    nm := receiver name.
-                    Text notNil ifTrue:[
-                        nm := nm allItalic
-                    ].
-                    err := 'sent to possibly uninitialized variable ''' , nm , ''' here (?)'.
-                    alreadyWarnedUninitializedVars isNil ifTrue:[
-                        alreadyWarnedUninitializedVars := Set new
-                    ].
-                    alreadyWarnedUninitializedVars add:receiver name
-                ]
-"/                ]
-        ] ifFalse:[
-            (err notNil and:[selClass notNil]) ifTrue:[
-                ((selClass == Boolean)
-                  and:[ receiver isMessage
-                  and:[ receiver selector == #'=' ]])
-                ifTrue:[
-                    err := err, ' (message to Boolean; did you mean ":=" instead of "=" in the receiver?)'
-                ] ifFalse:[
-                    err := err, ' (message to ' , selClass nameWithArticle , ')'.
-                ]
-            ].
-        ]]]]]].
+            ] ifFalse:[
+                (self isPossiblyUninitializedLocal:receiver) ifTrue:[
+    "/ (receiver isLocal and:[receiver token type isNil]) ifTrue:[
+                    "if it is an uninitialized variable ..."
+
+    "/                ((modifiedLocalVars isNil or:[(modifiedLocalVars includes:receiver name) not])
+    "/                 and:[hasPrimitiveCode not
+    "/                 and:[((receiver isMethodVariable and:[currentBlock isNil])
+    "/                      or:[ receiver isBlockVariable and:[receiver block == currentBlock]])
+    "/                 and:[alreadyWarnedUninitializedVars isNil
+    "/                      or:[(alreadyWarnedUninitializedVars includes:receiver name) not]]]])
+    "/                ifTrue:[
+                    ((#(at: at:put: basicAt: basicAt:put:) includes:selectorSymbol)
+                     or:[(nil respondsTo:selectorSymbol) not]) ifTrue:[
+                        "/ avoid trouble in miniTalk
+                        "/ during bootstrap
+                        nm := receiver name.
+                        Text notNil ifTrue:[
+                            nm := nm allItalic
+                        ].
+                        err := 'sent to possibly uninitialized variable ''' , nm , ''' here (?)'.
+                        alreadyWarnedUninitializedVars isNil ifTrue:[
+                            alreadyWarnedUninitializedVars := Set new
+                        ].
+                        alreadyWarnedUninitializedVars add:receiver name
+                    ]
+    "/                ]
+            ] ifFalse:[
+                selClass notNil ifTrue:[
+                    ((selClass == Boolean)
+                      and:[receiver isMessage
+                      and:[receiver selector == #=]])
+                    ifTrue:[
+                        err := err, ' (message to Boolean; did you mean ":=" instead of "=" in the receiver?)'
+                    ] ifFalse:[
+                        err := err, ' (message to ' , selClass nameWithArticle , ')'.
+                    ]
+                ].
+            ]]]]]].
+        ].
     ].
 
     err notNil ifTrue:[