> On 6 Aug 2022, at 07:26, Pierre Misse Chanabier 
> <[email protected]> wrote:
> 
> I do not know the syntax highlighter, but I know the AST fairly well.
> The first two points are fairly easy:
> 
> Color method temp variables and block parameter variables differently. 
> Currently they are identified too generally as just #variables. They are 
> therefore always the same color. Can someone point me to the parser classes 
> that extract these features?
> 
> Color differently Classes and other globals? I'm trying to find this 
> distinction as well in the parser classes. If someone familiar with the 
> parsing and related GUI classes can give me some pointers, I'll do the work.
> 
> Let the user assign colors to the first 7 levels of parentheses and first 7 
> levels of brackets.
> 
> 
> 1) There is no differences in the AST about temporary / arguments declaration.
> They are both at the level of the sequence node of the method/block (the 
> body).
> Thankfully we can ask for the parent and have a case for each.
> You'd have to modify visitTemporaryDeclarationNode:.
> 
> 2) There is no difference in the AST between classes / Globals.
> Because Classes are in fact Globals.
> You'd have to ask for the (self class environment classAt: aGlobal name)  
> ifNotNil: [ class behavior ] ifNil: [ global behavior ].
> 

This is true, but kid of not: the AST does not distinguish kind of variables, 
as this is not Grammar but “Semantics”. That is, every variables
use (definition, read, write) just gets one (new) instance of RBVariableNode.

But: we do name analysis for the AST. This means that the AST that you have in 
hand is always annotated with semantic information.

For Variables this means that every RBVariableNode instance has a “semantic 
variable” attached to it that models the Variable. 

(See Hierarchy of the class “Variable”).

Here now we get what we expect: for e.g. a temp there is *one* instance or a 
temp variable, and all the instances of RBVariableNode that are about that 
variable
reference the one instance.

With this, we can actually distinguish all the kinds of variables. (we pushed 
this so far that actually the compiler just asks the variable to generate 
bytecode, for example).
For ease of use, we have added test methods to RBVariableNode lile 
isTempVariable, isClassVariable, isInstanceVariable and so on.


> A quick look seem that the behavior of the syntax highlighter is in the 
> IconStyler class.
> (again, don't know it, just checking this out quickly).


The main part of the syntax highlighter is class SHRBTextStyler.

This is “just” a visitor on the AST (by including the trait 
TRBProgramNodeVisitor).

For example, the method called via the #visitVariableNode: method is this:

resolveStyleFor: aVariableNode
        aVariableNode binding ifNil: [^#default].
        aVariableNode isArgumentVariable ifTrue: [ ^#methodArg].
        aVariableNode isTempVariable ifTrue: [ ^#tempVar].
        aVariableNode isGlobalVariable ifTrue: [ ^#globalVar].
        "here we should add support for #classVar"
        aVariableNode isClassVariable ifTrue: [ ^#globalVar].
        aVariableNode isInstanceVariable ifTrue: [ ^#instVar]. 
        "for now we use temp variable here, we could now color them with their 
own color"
        aVariableNode isWorkspaceVariable ifTrue: [ ^#tempVar]. 
        
        (self class formatIncompleteIdentifiers and: [ aVariableNode 
hasIncompleteIdentifier ]) 
                ifTrue:[ ^#incompleteIdentifier] .
        "Note: if formatIncompleteIdentifiers is true, a non-exisiting variable 
might be incomplete"
        aVariableNode isUndeclaredVariable ifTrue: [ ^#undefinedIdentifier ].

        ^#invalid.


This shows that we, right now, do not distinguish globals from class variables, 
but all that  would be very easy to add, as the annotated AST has all that 
information.

(I always wanted to rewrite that method to just delegate to the aVariableNode 
and from there delatete to the Variable subclass and add a #styleSymbol method 
there, would make all that even simpler).


        Marcus





Reply via email to