/*
* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
* Use of this file is governed by the BSD 3-clause license that
* can be found in the LICENSE.txt file in the project root.
*/
package org.antlr.v4.codegen.model;
import org.antlr.v4.codegen.OutputModelFactory;
import org.antlr.v4.codegen.model.decl.CodeBlock;
import org.antlr.v4.tool.ast.GrammarAST;
/** */
public abstract class SrcOp extends OutputModelObject {
Used to create unique var names etc... /** Used to create unique var names etc... */
public int uniqueID; // TODO: do we need?
All operations know in which block they live:
CodeBlock, CodeBlockForAlt
Templates might need to know block nesting level or find
a specific declaration, etc...
/** All operations know in which block they live:
*
* CodeBlock, CodeBlockForAlt
*
* Templates might need to know block nesting level or find
* a specific declaration, etc...
*/
public CodeBlock enclosingBlock;
public RuleFunction enclosingRuleRunction;
public SrcOp(OutputModelFactory factory) { this(factory,null); }
public SrcOp(OutputModelFactory factory, GrammarAST ast) {
super(factory,ast);
if ( ast!=null ) uniqueID = ast.token.getTokenIndex();
enclosingBlock = factory.getCurrentBlock();
enclosingRuleRunction = factory.getCurrentRuleFunction();
}
Walk upwards in model tree, looking for outer alt's code block /** Walk upwards in model tree, looking for outer alt's code block */
public CodeBlockForOuterMostAlt getOuterMostAltCodeBlock() {
if ( this instanceof CodeBlockForOuterMostAlt ) {
return (CodeBlockForOuterMostAlt)this;
}
CodeBlock p = enclosingBlock;
while ( p!=null ) {
if ( p instanceof CodeBlockForOuterMostAlt ) {
return (CodeBlockForOuterMostAlt)p;
}
p = p.enclosingBlock;
}
return null;
}
Return label alt or return name of rule /** Return label alt or return name of rule */
public String getContextName() {
CodeBlockForOuterMostAlt alt = getOuterMostAltCodeBlock();
if ( alt!=null && alt.altLabel!=null ) return alt.altLabel;
return enclosingRuleRunction.name;
}
}