ConstantNode.st
branchjv
changeset 4723 524785227024
parent 4359 c609b51fba49
parent 4706 c66624849b64
--- a/ConstantNode.st	Sat Aug 08 22:49:53 2020 +0100
+++ b/ConstantNode.st	Tue Aug 25 12:20:06 2020 +0100
@@ -105,10 +105,10 @@
     "Modified: / 19-07-2011 / 17:24:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-type:t value:val from: startPos to: endPos
+type:t value:val from:startPos to:endPos
 
-    ^(self basicNew)
-        type: t value: val;
+    ^ (self basicNew)
+        type:t value:val;
         startPosition:startPos endPosition:endPos;
         yourself
 
@@ -153,6 +153,14 @@
     ^ #Literal
 ! !
 
+!ConstantNode methodsFor:'RBParser compatibility'!
+
+token
+    "for RB compatibility, I implement some of its protocol"
+
+    ^ self
+! !
+
 !ConstantNode methodsFor:'accessing'!
 
 lineNumber:ignoredLineNumber
@@ -171,18 +179,55 @@
     originalString := aString.
 
     "Modified (comment): / 15-02-2019 / 14:35:50 / Claus Gittinger"
+!
+
+radix
+    "the constant's original radix;
+     remembered so that we can prettyprint it later in the same radix"
+
+    value isInteger ifFalse:[
+        self error.
+        ^ nil.
+    ].
+    originalString isNil ifTrue:[
+        ^ 10
+    ].
+    originalString size < 2 ifTrue:[^ 10].
+    (originalString at:2) == $r ifTrue:[
+        ^ Integer readFrom:originalString readStream.
+    ].
+    originalString size < 3 ifTrue:[^ 10].
+    (originalString at:3) == $r ifTrue:[
+        ^ Integer readFrom:originalString readStream.
+    ].
+    (originalString startsWith:'0x') ifTrue:[^ 16].
+    (originalString startsWith:'0b') ifTrue:[^ 2].
+    (originalString startsWith:'0o') ifTrue:[^ 8].
+    ^ 10
 ! !
 
 !ConstantNode methodsFor:'code generation'!
 
 codeForSideEffectOn:aStream inBlock:b for:aCompiler
     "no code at all"
+    |msg|
+
+    (aCompiler parserFlags warnAboutDeadCodeAndFixMe) ifFalse:[^ self].
+
+    msg := 'Useless constant reference'.
 
     "/ but remember symbolic literals (such as #TODO)
     value isSymbol ifTrue:[
         aCompiler addLiteral:value.
-    ].
-    ^ self
+
+        ((#fixme sameAs:value) or:[#todo sameAs:value]) ifTrue:[
+            msg := 'Reminder in code: ',value  
+        ].
+    ].      
+    aCompiler 
+        warning:msg 
+        doNotShowAgainAction:(aCompiler actionToDisableWarning:#warnAboutDeadCodeAndFixMe)
+        position:startPosition to:endPosition.    
 
     "Modified: / 04-03-2007 / 15:29:54 / cg"
 !
@@ -398,6 +443,47 @@
     ^ value isNumber
 
     "Created: / 16-06-2018 / 08:46:53 / Claus Gittinger"
+!
+
+isLiteralArray
+    ^ value isArray
+
+    "Created: / 16-06-2018 / 08:46:53 / Claus Gittinger"
+!
+
+isLiteralCString
+    ^ self isSTXSpecialLiteralString:$c
+
+    "Created: / 16-06-2018 / 08:46:53 / Claus Gittinger"
+!
+
+isLiteralEString
+    ^ self isSTXSpecialLiteralString:$e
+
+    "Created: / 16-06-2018 / 08:46:53 / Claus Gittinger"
+!
+
+isLiteralIString
+    ^ self isSTXSpecialLiteralString:$i
+
+    "Created: / 16-06-2018 / 08:46:53 / Claus Gittinger"
+!
+
+isLiteralRString
+    ^ self isSTXSpecialLiteralString:$r
+
+    "Created: / 16-06-2018 / 08:46:53 / Claus Gittinger"
+!
+
+isSTXSpecialLiteralString:typeChar
+    ^ value isString 
+      and:[ originalString notNil 
+      and:[ originalString size > 2
+      and:[ (originalString at:1) == typeChar
+      and:[ (originalString at:2) == $'
+    ]]]]
+
+    "Created: / 16-06-2018 / 08:46:53 / Claus Gittinger"
 ! !
 
 !ConstantNode methodsFor:'visiting'!