Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-dev] Reading formal parameters from AST

Dear friends,
 
I currently try to get familar with the CDT-AST model. I want to implement a refactoring function that adds
some code to a project's main function. First, I want to check if the main function has the desired formal parameters.
 
In order to find the 'main' and and to check the type of the formal parameters I wrote the following code.
I have the feeling that it is a little bit to complex. Especially, the try-catch block that
uses Strings to check the parameter types appears cumbersome to me.

Any comments and ideas to improve the code are appreciated.
 

            final IASTNode node[] = new IASTNode[1];
            unit.accept(new CPPASTVisitor() {
			int i = 0;
			{
				shouldVisitDeclarators = true; 
			}
			@Override
			public int visit(IASTDeclarator declarator) 
			{
				System.out.println(i++ + " \"" + declarator.getName() + "\"");
				if(declarator instanceof IASTFunctionDeclarator && declarator.getName().toString().equals("main"))
					node[0] = declarator;
					
				return PROCESS_CONTINUE;
			}
		});
		
		if(node[0] == null)
			status.addFatalError("No 'main' function found in project.");
		else
		{
			IASTFunctionDeclarator mainDecl = (IASTFunctionDeclarator)node[0];
			if(mainDecl instanceof IASTStandardFunctionDeclarator)
			{
				IASTParameterDeclaration[] params = 
					((IASTStandardFunctionDeclarator)mainDecl).getParameters();
				
				IASTName argCountParam = params.length >= 1 ? params[0].getDeclarator().getName() : null;
				IASTName argValueParam = params.length >= 2 ? params[1].getDeclarator().getName() : null;
				
				try
				{
					if(argCountParam == null)
						status.addFatalError("'main' function lacks formal parameter for argument counter.");
					else
					{
						IVariable argCount = (IVariable)argCountParam.resolveBinding();
						String argcType = ASTTypeUtil.getType(argCount.getType());
						if(!"int".equals(argcType))
							status.addFatalError("First parameter of 'main' function is expected to be of type 'int'.");
					}
					if(argValueParam == null)
						status.addFatalError("'main' function lacks formal parameter for argument values.");
					else
					{
						IVariable argValue = (IVariable)argValueParam.resolveBinding();
						String argvType = ASTTypeUtil.getType(argValue.getType());
						if(!"char * *".equals(argvType))
							status.addFatalError("Second parameter of 'main' function is expected to be of type 'char **'.");
					}
				}
				catch(DOMException e1)
				{
					status.addFatalError(e1.getLocalizedMessage());
					e1.printStackTrace();
				}
				
		      }		 
 
 
Mit freundlichen Grüßen / Best regards

Dr. Nils Hagge
Projektleiter Vorfeld

Siemens AG
Industry Sector, I IA&DT ATS 13
Telefon +49 911 895-3484
Telefax +49 911 895-153484
mailto:nils.hagge@xxxxxxxxxxx <mailto:nils.hagge@xxxxxxxxxxx> 
<http://www.siemens.com/automation> http://www.siemens.com/automation <http://www.siemens.com/automation> 

Siemens Aktiengesellschaft: Chairman of the Supervisory Board: Gerhard Cromme
Managing Board: Peter Loescher, Chairman, President and Chief Executive Officer; 
Wolfgang Dehen, Heinrich Hiesinger, Joe Kaeser, Jim Reid-Anderson, Hermann Requardt,
Siegfried Russwurm, Peter Y. Solmssen
Registered offices: Berlin and Munich; 
Commercial registries: Berlin Charlottenburg, HRB 12300, Munich, HRB 6684
WEEE-Reg.-No. DE 23691322


Back to the top