From 77069bfaaab32b4c05e94266610578eaf11effe4 Mon Sep 17 00:00:00 2001 From: John Brant Date: Thu, 9 May 2019 20:50:04 -0500 Subject: [PATCH] adding a #parserClass method for nodes --- src/SmaCC_Runtime/SmaCCParseNode.class.st | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/SmaCC_Runtime/SmaCCParseNode.class.st b/src/SmaCC_Runtime/SmaCCParseNode.class.st index 6d89132b..e966ce19 100644 --- a/src/SmaCC_Runtime/SmaCCParseNode.class.st +++ b/src/SmaCC_Runtime/SmaCCParseNode.class.st @@ -30,6 +30,26 @@ SmaCCParseNode class >> collectionVariableIn: aSmaCCParseNode collectionGetter: ^ #() ] +{ #category : #accessing } +SmaCCParseNode class >> parserClass [ + "Return the parser class that likely created this node" + + | possibleClasses classNames topNodeClass | + self == SmaCCParseNode + ifTrue: [ ^ nil ]. + topNodeClass := self withAllSuperclasses + detect: [ :each | each superclass = SmaCCParseNode ]. + classNames := (topNodeClass withAllSubclasses collect: #name) asSet. + possibleClasses := SmaCCParser withAllSubclasses + select: [ :each | + (each class includesSelector: #symbolTypes) + and: [ each symbolTypes + anySatisfy: [ :clsName | classNames includes: clsName ] ] ]. + possibleClasses size = 1 + ifTrue: [ ^ possibleClasses first ]. + ^ nil +] + { #category : #accessing } SmaCCParseNode class >> variableIn: aSmaCCParseNode getter: aSymbol [ (aSmaCCParseNode respondsTo: aSymbol) @@ -689,6 +709,11 @@ SmaCCParseNode >> parentOfType: aSmaCCParseNodeClassOrCollection [ ifFalse: [ nil ] ] +{ #category : #accessing } +SmaCCParseNode >> parserClass [ + ^ self class parserClass +] + { #category : #copying } SmaCCParseNode >> postCopy [ super postCopy.