mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 17:05:26 +02:00
AST building actions for function definitions
This commit is contained in:
parent
c3565edec0
commit
31652900d1
7 changed files with 2022 additions and 1915 deletions
|
@ -65,11 +65,13 @@ import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
|
||||
|
@ -104,6 +106,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTCatchHandler;
|
|||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTCompoundStatement;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConditionalExpression;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConstructorChainInitializer;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConstructorInitializer;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTContinueStatement;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConversionName;
|
||||
|
@ -123,6 +126,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTForStatement;
|
|||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionCallExpression;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDeclarator;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDefinition;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionTryBlockDeclarator;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTGotoStatement;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTIdExpression;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTIfStatement;
|
||||
|
@ -503,4 +507,12 @@ public class CPPASTNodeFactory implements ICPPASTNodeFactory {
|
|||
return new CPPASTParameterDeclaration(declSpec, declarator);
|
||||
}
|
||||
|
||||
public ICPPASTConstructorChainInitializer newConstructorChainInitializer(IASTName name, IASTExpression expr) {
|
||||
return new CPPASTConstructorChainInitializer(name, expr);
|
||||
}
|
||||
|
||||
public ICPPASTFunctionTryBlockDeclarator newFunctionTryBlockDeclarator(IASTName name) {
|
||||
return new CPPASTFunctionTryBlockDeclarator(name);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import lpg.lpgjavaruntime.IToken;
|
|||
|
||||
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement;
|
||||
|
@ -29,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
|
||||
|
@ -46,12 +48,14 @@ import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
|
||||
|
@ -77,6 +81,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBas
|
|||
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
|
||||
import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction;
|
||||
import org.eclipse.cdt.core.dom.lrparser.util.DebugUtil;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDeclarator;
|
||||
|
||||
/**
|
||||
* Semantic actions that build the AST during the parse. These are the actions
|
||||
|
@ -1310,7 +1315,76 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
|
|||
astStack.push(declarator);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* mem_initializer
|
||||
* ::= mem_initializer_id '(' expression_list_opt ')'
|
||||
*/
|
||||
public void consumeConstructorChainInitializer() {
|
||||
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
|
||||
|
||||
IASTExpression expr = (IASTExpression) astStack.pop();
|
||||
IASTName name = (IASTName) astStack.pop();
|
||||
ICPPASTConstructorChainInitializer initializer = nodeFactory.newConstructorChainInitializer(name, expr);
|
||||
setOffsetAndLength(initializer);
|
||||
astStack.push(initializer);
|
||||
|
||||
if(TRACE_AST_STACK) System.out.println(astStack);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* function_definition
|
||||
* ::= declaration_specifiers_opt function_direct_declarator
|
||||
* <openscope-ast> ctor_initializer_list_opt function_body
|
||||
*
|
||||
* | declaration_specifiers_opt function_direct_declarator
|
||||
* 'try' <openscope-ast> ctor_initializer_list_opt function_body <openscope-ast> handler_seq
|
||||
*
|
||||
*/
|
||||
public void consumeFunctionDefinition(boolean isTryBlockDeclarator) {
|
||||
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
|
||||
|
||||
List<Object> handlers = isTryBlockDeclarator ? astStack.closeScope() : Collections.emptyList();
|
||||
IASTCompoundStatement body = (IASTCompoundStatement) astStack.pop();
|
||||
List<Object> initializers = astStack.closeScope();
|
||||
ICPPASTFunctionDeclarator declarator = (ICPPASTFunctionDeclarator) astStack.pop();
|
||||
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop(); // may be null
|
||||
|
||||
if(isTryBlockDeclarator) {
|
||||
// perform a shallow copy
|
||||
ICPPASTFunctionTryBlockDeclarator tryBlockDeclarator = nodeFactory.newFunctionTryBlockDeclarator(declarator.getName());
|
||||
tryBlockDeclarator.setConst(declarator.isConst());
|
||||
tryBlockDeclarator.setVolatile(declarator.isVolatile());
|
||||
tryBlockDeclarator.setPureVirtual(declarator.isPureVirtual());
|
||||
tryBlockDeclarator.setVarArgs(declarator.takesVarArgs());
|
||||
for(IASTParameterDeclaration parameter : declarator.getParameters()) {
|
||||
tryBlockDeclarator.addParameterDeclaration(parameter);
|
||||
}
|
||||
for(IASTTypeId exception : declarator.getExceptionSpecification()) {
|
||||
tryBlockDeclarator.addExceptionSpecificationTypeId(exception);
|
||||
}
|
||||
|
||||
for(Object handler : handlers) {
|
||||
tryBlockDeclarator.addCatchHandler((ICPPASTCatchHandler)handler);
|
||||
}
|
||||
|
||||
declarator = tryBlockDeclarator;
|
||||
}
|
||||
|
||||
for(Object initializer : initializers) {
|
||||
declarator.addConstructorToChain((ICPPASTConstructorChainInitializer)initializer);
|
||||
}
|
||||
|
||||
IASTFunctionDefinition definition = nodeFactory.newFunctionDefinition(declSpec, declarator, body);
|
||||
|
||||
setOffsetAndLength(definition);
|
||||
astStack.push(definition);
|
||||
|
||||
if(TRACE_AST_STACK) System.out.println(astStack);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -22,11 +22,13 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
|
||||
|
@ -119,4 +121,9 @@ public interface ICPPASTNodeFactory extends IASTNodeFactory {
|
|||
public ICPPASTConstructorInitializer newConstructorInitializer(IASTExpression exp);
|
||||
|
||||
public ICPPASTFunctionDeclarator newCPPFunctionDeclarator(IASTName name);
|
||||
|
||||
public ICPPASTConstructorChainInitializer newConstructorChainInitializer(
|
||||
IASTName name, IASTExpression expr);
|
||||
|
||||
public ICPPASTFunctionTryBlockDeclarator newFunctionTryBlockDeclarator(IASTName name);
|
||||
}
|
||||
|
|
|
@ -1346,14 +1346,6 @@ parameter_declaration_list_opt
|
|||
| $empty
|
||||
|
||||
|
||||
-- its just a declarator with an initializer
|
||||
--parameter_declaration
|
||||
-- ::= declaration_specifiers declarator
|
||||
-- | declaration_specifiers declarator = assignment_expression
|
||||
-- | declaration_specifiers abstract_declarator_opt
|
||||
-- | declaration_specifiers abstract_declarator_opt = assignment_expression
|
||||
|
||||
|
||||
abstract_declarator_opt
|
||||
::= abstract_declarator
|
||||
| $empty
|
||||
|
@ -1384,10 +1376,12 @@ parameter_initializer
|
|||
|
||||
|
||||
function_definition
|
||||
::= declaration_specifiers_opt declarator ctor_initializer_opt function_body
|
||||
| declaration_specifiers_opt declarator function_try_block
|
||||
::= declaration_specifiers_opt function_direct_declarator <openscope-ast> ctor_initializer_list_opt function_body
|
||||
|
||||
| declaration_specifiers_opt function_direct_declarator 'try' <openscope-ast> ctor_initializer_list_opt function_body <openscope-ast> handler_seq
|
||||
|
||||
|
||||
|
||||
function_body
|
||||
::= compound_statement
|
||||
|
||||
|
@ -1563,12 +1557,12 @@ conversion_declarator_opt
|
|||
| $empty
|
||||
|
||||
|
||||
ctor_initializer
|
||||
ctor_initializer_list
|
||||
::= ':' mem_initializer_list
|
||||
|
||||
|
||||
ctor_initializer_opt
|
||||
::= ctor_initializer
|
||||
ctor_initializer_list_opt
|
||||
::= ctor_initializer_list
|
||||
| $empty
|
||||
|
||||
|
||||
|
@ -1578,12 +1572,14 @@ mem_initializer_list
|
|||
|
||||
|
||||
mem_initializer
|
||||
::= mem_initializer_id '(' expression_list_opt ')'
|
||||
::= mem_initializer_name '(' expression_list_opt ')'
|
||||
/. $Build consumeConstructorChainInitializer(); $EndBuild ./
|
||||
|
||||
|
||||
mem_initializer_id
|
||||
mem_initializer_name
|
||||
::= dcolon_opt nested_name_specifier_opt class_name
|
||||
| 'identifier'
|
||||
/. $Build consumeQualifiedId(false); $EndBuild ./
|
||||
| identifier_name
|
||||
|
||||
|
||||
operator_function_id_name
|
||||
|
@ -1677,8 +1673,7 @@ try_block
|
|||
/. $Build consumeStatementTryBlock(); $EndBuild ./
|
||||
|
||||
|
||||
function_try_block
|
||||
::= 'try' ctor_initializer_opt function_body handler_seq
|
||||
|
||||
|
||||
|
||||
handler_seq
|
||||
|
|
|
@ -200,7 +200,7 @@ public int getKind(int i) {
|
|||
// Initialize ruleAction array.
|
||||
//
|
||||
static {
|
||||
RULE_ACTIONS = new Action[526 + 1];
|
||||
RULE_ACTIONS = new Action[525 + 1];
|
||||
RULE_ACTIONS[0] = null;
|
||||
|
||||
RULE_ACTIONS[1] = new Action1();
|
||||
|
@ -421,6 +421,8 @@ public int getKind(int i) {
|
|||
RULE_ACTIONS[423] = new Action423();
|
||||
RULE_ACTIONS[424] = new Action424();
|
||||
RULE_ACTIONS[430] = new Action430();
|
||||
RULE_ACTIONS[440] = new Action440();
|
||||
RULE_ACTIONS[441] = new Action441();
|
||||
RULE_ACTIONS[444] = new Action444();
|
||||
RULE_ACTIONS[445] = new Action445();
|
||||
RULE_ACTIONS[488] = new Action488();
|
||||
|
@ -430,8 +432,8 @@ public int getKind(int i) {
|
|||
RULE_ACTIONS[510] = new Action510();
|
||||
RULE_ACTIONS[511] = new Action511();
|
||||
RULE_ACTIONS[512] = new Action512();
|
||||
RULE_ACTIONS[515] = new Action515();
|
||||
RULE_ACTIONS[516] = new Action516();
|
||||
RULE_ACTIONS[517] = new Action517();
|
||||
|
||||
|
||||
//
|
||||
|
@ -2624,6 +2626,26 @@ public int getKind(int i) {
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 440: mem_initializer ::= mem_initializer_name ( expression_list_opt )
|
||||
//
|
||||
static final class Action440 extends DeclaredAction< CPPParserAction , Object > {
|
||||
|
||||
public void doFinal(ITrialUndoActionProvider< Object > provider, CPPParserAction action) { action.builder.
|
||||
consumeConstructorChainInitializer();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 441: mem_initializer_name ::= dcolon_opt nested_name_specifier_opt class_name
|
||||
//
|
||||
static final class Action441 extends DeclaredAction< CPPParserAction , Object > {
|
||||
|
||||
public void doFinal(ITrialUndoActionProvider< Object > provider, CPPParserAction action) { action.builder.
|
||||
consumeQualifiedId(false);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 444: operator_function_id_name ::= operator_id_name < <openscope-ast> template_argument_list_opt >
|
||||
//
|
||||
|
@ -2715,9 +2737,9 @@ public int getKind(int i) {
|
|||
}
|
||||
|
||||
//
|
||||
// Rule 516: handler ::= catch ( exception_declaration ) compound_statement
|
||||
// Rule 515: handler ::= catch ( exception_declaration ) compound_statement
|
||||
//
|
||||
static final class Action516 extends DeclaredAction< CPPParserAction , Object > {
|
||||
static final class Action515 extends DeclaredAction< CPPParserAction , Object > {
|
||||
|
||||
public void doFinal(ITrialUndoActionProvider< Object > provider, CPPParserAction action) { action.builder.
|
||||
consumeStatementCatchHandler(false);
|
||||
|
@ -2725,9 +2747,9 @@ public int getKind(int i) {
|
|||
}
|
||||
|
||||
//
|
||||
// Rule 517: handler ::= catch ( ... ) compound_statement
|
||||
// Rule 516: handler ::= catch ( ... ) compound_statement
|
||||
//
|
||||
static final class Action517 extends DeclaredAction< CPPParserAction , Object > {
|
||||
static final class Action516 extends DeclaredAction< CPPParserAction , Object > {
|
||||
|
||||
public void doFinal(ITrialUndoActionProvider< Object > provider, CPPParserAction action) { action.builder.
|
||||
consumeStatementCatchHandler(true);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -65,7 +65,7 @@ public interface CPPParsersym {
|
|||
TK_template = 44,
|
||||
TK_this = 32,
|
||||
TK_throw = 39,
|
||||
TK_try = 73,
|
||||
TK_try = 74,
|
||||
TK_true = 33,
|
||||
TK_typedef = 56,
|
||||
TK_typeid = 34,
|
||||
|
@ -134,7 +134,7 @@ public interface CPPParsersym {
|
|||
TK_OrAssign = 111,
|
||||
TK_Comma = 68,
|
||||
TK_RightBracket = 113,
|
||||
TK_RightParen = 74,
|
||||
TK_RightParen = 73,
|
||||
TK_RightBrace = 71,
|
||||
TK_SemiColon = 40,
|
||||
TK_ERROR_TOKEN = 45,
|
||||
|
@ -214,8 +214,8 @@ public interface CPPParsersym {
|
|||
"Colon",
|
||||
"RightBrace",
|
||||
"export",
|
||||
"try",
|
||||
"RightParen",
|
||||
"try",
|
||||
"while",
|
||||
"break",
|
||||
"case",
|
||||
|
|
Loading…
Add table
Reference in a new issue