modeling asts with fast (mooseday13)
TRANSCRIPT
PROBLEM?
• Calculating metrics
• Rule checking
• Detecting duplication
• Representing (eg. visualizing)
• Language conversions
• And more…
GENERAL FAST DIAGRAM
FASTBehaviouralEntity
0..*
statements
0..1
parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
FAMIXBehaviouralEntity0..1
fastNamedBehaviouralEntity
0..1
famixBehaviouralEntity
FAMIXNamedEntity0..*
fastNamedEntities
0..1
famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity
0..1parentExpression**
0..1parentStatement**
FASTStatementBlock
0..1parentBehaviouralEntity
0..1
statementBlockFASTVariableExpression
0..1parentVariableExpression
0..1
variable
FASTLiteral
signature : string
GENERAL FAST DIAGRAM
FASTBehaviouralEntity
0..*
statements
0..1
parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
FAMIXBehaviouralEntity0..1
fastNamedBehaviouralEntity
0..1
famixBehaviouralEntity
FAMIXNamedEntity0..*
fastNamedEntities
0..1
famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity
0..1parentExpression**
0..1parentStatement**
FASTStatementBlock
0..1parentBehaviouralEntity
0..1
statementBlockFASTVariableExpression
0..1parentVariableExpression
0..1
variable
FASTLiteral
signature : string
GENERAL FAST DIAGRAM
FASTBehaviouralEntity
0..*
statements
0..1
parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
FAMIXBehaviouralEntity0..1
fastNamedBehaviouralEntity
0..1
famixBehaviouralEntity
FAMIXNamedEntity0..*
fastNamedEntities
0..1
famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity
0..1parentExpression**
0..1parentStatement**
FASTStatementBlock
0..1parentBehaviouralEntity
0..1
statementBlockFASTVariableExpression
0..1parentVariableExpression
0..1
variable
FASTLiteral
signature : string
GENERAL FAST DIAGRAM
FASTBehaviouralEntity
0..*
statements
0..1
parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
FAMIXBehaviouralEntity0..1
fastNamedBehaviouralEntity
0..1
famixBehaviouralEntity
FAMIXNamedEntity0..*
fastNamedEntities
0..1
famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity
0..1parentExpression**
0..1parentStatement**
FASTStatementBlock
0..1parentBehaviouralEntity
0..1
statementBlockFASTVariableExpression
0..1parentVariableExpression
0..1
variable
FASTLiteral
signature : string
FASTBehaviouralEntity
0..*
statements
0..1
parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
FAMIXBehaviouralEntity0..1
fastNamedBehaviouralEntity
0..1
famixBehaviouralEntity
FAMIXNamedEntity0..*
fastNamedEntities
0..1
famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity
0..1parentExpression**
0..1parentStatement**
FASTStatementBlock
0..1parentBehaviouralEntity
0..1
statementBlockFASTVariableExpression
0..1parentVariableExpression
0..1
variable
FASTLiteral
signature : string
GENERAL FAST DIAGRAM
FASTBehaviouralEntity
0..*
statements
0..1
parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
FAMIXBehaviouralEntity0..1
fastNamedBehaviouralEntity
0..1
famixBehaviouralEntity
FAMIXNamedEntity0..*
fastNamedEntities
0..1
famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity
0..1parentExpression**
0..1parentStatement**
FASTStatementBlock
0..1parentBehaviouralEntity
0..1
statementBlockFASTVariableExpression
0..1parentVariableExpression
0..1
variable
FASTLiteral
signature : string
GENERAL FAST DIAGRAM
SMALLTALK FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTVariableExpression FASTLiteral
signature : String
FASTMessageSend
kindselector
isUnary()isBinary()isKey()cascaded()receiver()
FASTStatement
0..1parentExpression
0..*arguments
FASTAssignmentExpression
0..1parentAssignmentExpression
0..1variable
FASTExpression
0..1parentStatement 0..1
expression
FASTArrayExpression FASTCascade
0..1parentCascade
0..*messages
0..1
parentExpression
0..1
concreteReceiver
0..1parentExpression
0..1block
FASTSmalltalkReturnStatement
FASTSmalltalkExpressionStatement
0..1parentStatement 0..1
expression
0..1parentExpression
0..1
expression
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
0..1parentVariableExpression
0..1variable
FASTBlockDefinition
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTNumberLiteral
value : Number
FASTCharacterLiteral
value : Object
FASTStringLiteral
value : String
FASTSymbolLiteral
value : Object
FASTArrayLiteral FASTByteArrayLiteral
0..*contents
0..*contents
FASTBlockExpression
0..1parentExpression
0..*contents
FASTBooleanLiteral
value : Boolean
FASTUndefinedLiteral
0..1parentExpression
0..1receiver
0..1parentBehaviouralEntity
FAMIXInvocation
0..1messageSend
0..1invocation
FASTStatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
SMALLTALK FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTVariableExpression FASTLiteral
signature : String
FASTMessageSend
kindselector
isUnary()isBinary()isKey()cascaded()receiver()
FASTStatement
0..1parentExpression
0..*arguments
FASTAssignmentExpression
0..1parentAssignmentExpression
0..1variable
FASTExpression
0..1parentStatement 0..1
expression
FASTArrayExpression FASTCascade
0..1parentCascade
0..*messages
0..1
parentExpression
0..1
concreteReceiver
0..1parentExpression
0..1block
FASTSmalltalkReturnStatement
FASTSmalltalkExpressionStatement
0..1parentStatement 0..1
expression
0..1parentExpression
0..1
expression
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
0..1parentVariableExpression
0..1variable
FASTBlockDefinition
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTNumberLiteral
value : Number
FASTCharacterLiteral
value : Object
FASTStringLiteral
value : String
FASTSymbolLiteral
value : Object
FASTArrayLiteral FASTByteArrayLiteral
0..*contents
0..*contents
FASTBlockExpression
0..1parentExpression
0..*contents
FASTBooleanLiteral
value : Boolean
FASTUndefinedLiteral
0..1parentExpression
0..1receiver
0..1parentBehaviouralEntity
FAMIXInvocation
0..1messageSend
0..1invocation
FASTStatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
SMALLTALK FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTVariableExpression FASTLiteral
signature : String
FASTMessageSend
kindselector
isUnary()isBinary()isKey()cascaded()receiver()
FASTStatement
0..1parentExpression
0..*arguments
FASTAssignmentExpression
0..1parentAssignmentExpression
0..1variable
FASTExpression
0..1parentStatement 0..1
expression
FASTArrayExpression FASTCascade
0..1parentCascade
0..*messages
0..1
parentExpression
0..1
concreteReceiver
0..1parentExpression
0..1block
FASTSmalltalkReturnStatement
FASTSmalltalkExpressionStatement
0..1parentStatement 0..1
expression
0..1parentExpression
0..1
expression
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
0..1parentVariableExpression
0..1variable
FASTBlockDefinition
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTNumberLiteral
value : Number
FASTCharacterLiteral
value : Object
FASTStringLiteral
value : String
FASTSymbolLiteral
value : Object
FASTArrayLiteral FASTByteArrayLiteral
0..*contents
0..*contents
FASTBlockExpression
0..1parentExpression
0..*contents
FASTBooleanLiteral
value : Boolean
FASTUndefinedLiteral
0..1parentExpression
0..1receiver
0..1parentBehaviouralEntity
FAMIXInvocation
0..1messageSend
0..1invocation
FASTStatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
SMALLTALK FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTVariableExpression FASTLiteral
signature : String
FASTMessageSend
kindselector
isUnary()isBinary()isKey()cascaded()receiver()
FASTStatement
0..1parentExpression
0..*arguments
FASTAssignmentExpression
0..1parentAssignmentExpression
0..1variable
FASTExpression
0..1parentStatement 0..1
expression
FASTArrayExpression FASTCascade
0..1parentCascade
0..*messages
0..1
parentExpression
0..1
concreteReceiver
0..1parentExpression
0..1block
FASTSmalltalkReturnStatement
FASTSmalltalkExpressionStatement
0..1parentStatement 0..1
expression
0..1parentExpression
0..1
expression
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
0..1parentVariableExpression
0..1variable
FASTBlockDefinition
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTNumberLiteral
value : Number
FASTCharacterLiteral
value : Object
FASTStringLiteral
value : String
FASTSymbolLiteral
value : Object
FASTArrayLiteral FASTByteArrayLiteral
0..*contents
0..*contents
FASTBlockExpression
0..1parentExpression
0..*contents
FASTBooleanLiteral
value : Boolean
FASTUndefinedLiteral
0..1parentExpression
0..1receiver
0..1parentBehaviouralEntity
FAMIXInvocation
0..1messageSend
0..1invocation
FASTStatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
SMALLTALK FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTVariableExpression FASTLiteral
signature : String
FASTMessageSend
kindselector
isUnary()isBinary()isKey()cascaded()receiver()
FASTStatement
0..1parentExpression
0..*arguments
FASTAssignmentExpression
0..1parentAssignmentExpression
0..1variable
FASTExpression
0..1parentStatement 0..1
expression
FASTArrayExpression FASTCascade
0..1parentCascade
0..*messages
0..1
parentExpression
0..1
concreteReceiver
0..1parentExpression
0..1block
FASTSmalltalkReturnStatement
FASTSmalltalkExpressionStatement
0..1parentStatement 0..1
expression
0..1parentExpression
0..1
expression
FASTNamedEntity
name : String0..*
parameters
0..*localVariables
0..1parentVariableExpression
0..1variable
FASTBlockDefinition
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTNumberLiteral
value : Number
FASTCharacterLiteral
value : Object
FASTStringLiteral
value : String
FASTSymbolLiteral
value : Object
FASTArrayLiteral FASTByteArrayLiteral
0..*contents
0..*contents
FASTBlockExpression
0..1parentExpression
0..*contents
FASTBooleanLiteral
value : Boolean
FASTUndefinedLiteral
0..1parentExpression
0..1receiver
0..1parentBehaviouralEntity
FAMIXInvocation
0..1messageSend
0..1invocation
FASTStatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
JAVA FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*parameters
0..*localVariables
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity StatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
FASTVariableExpression0..1parentVariableExpression
0..1variable
FASTLiteral
signature : string
FASTJavaExpressionStatement
FASTJavaReturnStatement
0..1parentStatement
0..1expression
0..1parentStatement
0..1expression
FASTWhileStatement
0..1parentStatement
0..1condition
0..1parentStatement
0..1body
FASTVariableDeclarationStatement
FASTVariableDeclarator0..1parentStatement
0..*
declarators0..1variable
0..1
initializer
FASTJavaIntegerLiteral FASTJavaBooleanLiteral FASTJavaStringLiteral
FASTInfixOperation 0..1parentExpression
0..1leftOperand
0..1parentExpression
0..1rightOperand
JAVA FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*parameters
0..*localVariables
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity StatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
FASTVariableExpression0..1parentVariableExpression
0..1variable
FASTLiteral
signature : string
FASTJavaExpressionStatement
FASTJavaReturnStatement
0..1parentStatement
0..1expression
0..1parentStatement
0..1expression
FASTWhileStatement
0..1parentStatement
0..1condition
0..1parentStatement
0..1body
FASTVariableDeclarationStatement
FASTVariableDeclarator0..1parentStatement
0..*
declarators0..1variable
0..1
initializer
FASTJavaIntegerLiteral FASTJavaBooleanLiteral FASTJavaStringLiteral
FASTInfixOperation 0..1parentExpression
0..1leftOperand
0..1parentExpression
0..1rightOperand
JAVA FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*parameters
0..*localVariables
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity StatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
FASTVariableExpression0..1parentVariableExpression
0..1variable
FASTLiteral
signature : string
FASTJavaExpressionStatement
FASTJavaReturnStatement
0..1parentStatement
0..1expression
0..1parentStatement
0..1expression
FASTWhileStatement
0..1parentStatement
0..1condition
0..1parentStatement
0..1body
FASTVariableDeclarationStatement
FASTVariableDeclarator0..1parentStatement
0..*
declarators0..1variable
0..1
initializer
FASTJavaIntegerLiteral FASTJavaBooleanLiteral FASTJavaStringLiteral
FASTInfixOperation 0..1parentExpression
0..1leftOperand
0..1parentExpression
0..1rightOperand
JAVA FAST DIAGRAM
FASTBehaviouralEntity
0..*statements
0..1parentStatementBlock
FASTStatement
FASTNamedEntity
name : String0..*parameters
0..*localVariables
FAMIXBehaviouralEntity
0..1fastNamedBehaviouralEntity
0..1famixBehaviouralEntity
FAMIXNamedEntity
0..*fastNamedEntities
0..1famixNamedEntity
FASTNamedBehaviouralEntity
name : String
FASTExpression
0..1parentBehaviouralEntity StatementBlock
0..1parentBehaviouralEntity
0..1statementBlock
FASTVariableExpression0..1parentVariableExpression
0..1variable
FASTLiteral
signature : string
FASTJavaExpressionStatement
FASTJavaReturnStatement
0..1parentStatement
0..1expression
0..1parentStatement
0..1expression
FASTWhileStatement
0..1parentStatement
0..1condition
0..1parentStatement
0..1body
FASTVariableDeclarationStatement
FASTVariableDeclarator0..1parentStatement
0..*
declarators0..1variable
0..1
initializer
FASTJavaIntegerLiteral FASTJavaBooleanLiteral FASTJavaStringLiteral
FASTInfixOperation 0..1parentExpression
0..1leftOperand
0..1parentExpression
0..1rightOperand
SYMBOL RESOLUTION
#middleOf:and:b
a
sum^stst
:=
sum +
a b
/
sum 2
middleOf: a and: b | sum | sum := a + b. ^ sum / 2
RESOLVING SYMBOLS
Scope• name-variable dictionary• parent scope• owner entity
Scope• name-variable dictionary• parent scope• owner entity
CALCULATING METRICS
collection inject: initial into: [block]CollectorVisitor newWithSeed: initial andBlock: [block]
CYCLOMATIC COMPLEXITY
Each node knows it’s complexity contribution
• Class = 0• ReturnStatement = 0• IfStatement = 1• WhileStatement = 1• MessageSend (#ifTrue:) = 1 calculated at runtime
• MessageSend (#detect:ifNone:) = 2• “for ... else” statement = 2 python
FAST CONTRIBUTION
http://smalltalkhub.com/#!/~YuriyTymchuk/FAST
https://github.com/Uko/FAST
https://ci.inria.fr/moose/job/FAST-On-Moose
FAST GSOC
FAST Java Model Tree models visualizationThe idea behind this project is to d e ve l o p a n i n t e r a c t i v e t r e e visualization that wil l gradually improve analysis of the underlying model.
The goal of this project is to create a Java version of FAST.
THANKS
Stéphane Ducasse
Nicolas Anquetil
RMoD team