| /********************************************************************** |
| * Copyright (c) 2002,2003 Rational Software Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v0.5 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v05.html |
| * |
| * Contributors: |
| * IBM Rational Software - Initial API and implementation |
| ***********************************************************************/ |
| package org.eclipse.cdt.internal.core.parser; |
| import java.util.LinkedList; |
| |
| import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; |
| import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; |
| import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; |
| import org.eclipse.cdt.core.parser.ast.IASTDeclaration; |
| import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier; |
| import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier; |
| import org.eclipse.cdt.core.parser.ast.IASTField; |
| import org.eclipse.cdt.core.parser.ast.IASTFunction; |
| import org.eclipse.cdt.core.parser.ast.IASTInclusion; |
| import org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification; |
| import org.eclipse.cdt.core.parser.ast.IASTMacro; |
| import org.eclipse.cdt.core.parser.ast.IASTMethod; |
| import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition; |
| import org.eclipse.cdt.core.parser.ast.IASTNode; |
| import org.eclipse.cdt.core.parser.ast.IASTScope; |
| import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration; |
| import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration; |
| import org.eclipse.cdt.core.parser.ast.IASTVariable; |
| import org.eclipse.cdt.internal.core.parser.QuickParseCallback; |
| import org.eclipse.cdt.internal.core.parser.ast.complete.ASTScope; |
| |
| /** |
| * @author hamer |
| * |
| * To change the template for this generated type comment go to |
| * Window - Preferences - Java - Code Generation - Code and Comments |
| */ |
| public class StructuralParseCallback extends QuickParseCallback{ |
| |
| protected LinkedList scopeStack = new LinkedList(); |
| protected IASTScope currentScope = null; |
| protected int inclusionLevel = 0; |
| |
| |
| private void addElement (IASTDeclaration element){ |
| if(inclusionLevel == 0) |
| ((ASTScope)currentScope).addDeclaration(element); |
| } |
| |
| private void enterScope(IASTNode node){ |
| if(node instanceof IASTScope){ |
| pushScope((IASTScope)node); |
| } |
| } |
| |
| private void exitScope(IASTNode node){ |
| if(node instanceof IASTScope){ |
| popScope(); |
| } |
| } |
| |
| private void pushScope( IASTScope scope ){ |
| scopeStack.addFirst( currentScope ); |
| currentScope = (IASTScope)scope; |
| } |
| |
| private IASTScope popScope(){ |
| IASTScope oldScope = currentScope; |
| currentScope = (scopeStack.size() > 0 ) ? (IASTScope) scopeStack.removeFirst() : null; |
| return oldScope; |
| } |
| |
| private IASTScope peekAtScope(){ |
| return currentScope; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptMacro(org.eclipse.cdt.core.parser.ast.IASTMacro) |
| */ |
| public void acceptMacro(IASTMacro macro) { |
| if(inclusionLevel == 0) |
| macros.add(macro); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptVariable(org.eclipse.cdt.core.parser.ast.IASTVariable) |
| */ |
| public void acceptVariable(IASTVariable variable) { |
| addElement(variable); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptFunctionDeclaration(org.eclipse.cdt.core.parser.ast.IASTFunction) |
| */ |
| public void acceptFunctionDeclaration(IASTFunction function) { |
| addElement(function); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptTypedefDeclaration(org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration) |
| */ |
| public void acceptTypedefDeclaration(IASTTypedefDeclaration typedef) { |
| addElement(typedef); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptEnumerationSpecifier(org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier) |
| */ |
| public void acceptEnumerationSpecifier(IASTEnumerationSpecifier enumeration) { |
| enterScope(enumeration); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptElaboratedForewardDeclaration(org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier) |
| */ |
| public void acceptElaboratedForewardDeclaration(IASTElaboratedTypeSpecifier elaboratedType) { |
| enterScope(elaboratedType); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptAbstractTypeSpecDeclaration(org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration) |
| */ |
| public void acceptAbstractTypeSpecDeclaration(IASTAbstractTypeSpecifierDeclaration abstractDeclaration) { |
| addElement(abstractDeclaration); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterInclusion(org.eclipse.cdt.core.parser.ast.IASTInclusion) |
| */ |
| public void enterInclusion(IASTInclusion inclusion) { |
| if(inclusionLevel == 0) |
| inclusions.add(inclusion); |
| inclusionLevel++; |
| |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterNamespaceDefinition(org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition) |
| */ |
| public void enterNamespaceDefinition(IASTNamespaceDefinition namespaceDefinition) { |
| addElement(namespaceDefinition); |
| enterScope(namespaceDefinition); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterClassSpecifier(org.eclipse.cdt.core.parser.ast.IASTClassSpecifier) |
| */ |
| public void enterClassSpecifier(IASTClassSpecifier classSpecification) { |
| enterScope(classSpecification); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterLinkageSpecification(org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification) |
| */ |
| public void enterLinkageSpecification(IASTLinkageSpecification linkageSpec) { |
| enterScope(linkageSpec); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterCompilationUnit(org.eclipse.cdt.core.parser.ast.IASTCompilationUnit) |
| */ |
| public void enterCompilationUnit(IASTCompilationUnit compilationUnit) { |
| enterScope(compilationUnit); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptMethodDeclaration(org.eclipse.cdt.core.parser.ast.IASTMethod) |
| */ |
| public void acceptMethodDeclaration(IASTMethod method) { |
| addElement(method); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptField(org.eclipse.cdt.core.parser.ast.IASTField) |
| */ |
| public void acceptField(IASTField field) { |
| addElement(field); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitCompilationUnit(org.eclipse.cdt.core.parser.ast.IASTCompilationUnit) |
| */ |
| public void exitCompilationUnit(IASTCompilationUnit compilationUnit) { |
| exitScope(compilationUnit); |
| this.compilationUnit = compilationUnit; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitInclusion(org.eclipse.cdt.core.parser.ast.IASTInclusion) |
| */ |
| public void exitInclusion( IASTInclusion inclusion ) |
| { |
| inclusionLevel--; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.IQuickParseCallback#getCompilationUnit() |
| */ |
| public IASTCompilationUnit getCompilationUnit() { |
| return compilationUnit; } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitClassSpecifier(org.eclipse.cdt.core.parser.ast.IASTClassSpecifier) |
| */ |
| public void exitClassSpecifier(IASTClassSpecifier classSpecification) { |
| exitScope(classSpecification); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitLinkageSpecification(org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification) |
| */ |
| public void exitLinkageSpecification(IASTLinkageSpecification linkageSpec) { |
| exitScope(linkageSpec); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitNamespaceDefinition(org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition) |
| */ |
| public void exitNamespaceDefinition(IASTNamespaceDefinition namespaceDefinition) { |
| exitScope(namespaceDefinition); |
| } |
| |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterFunctionBody(org.eclipse.cdt.core.parser.ast.IASTFunction) |
| */ |
| public void enterFunctionBody(IASTFunction function) { |
| addElement(function); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterMethodBody(org.eclipse.cdt.core.parser.ast.IASTMethod) |
| */ |
| public void enterMethodBody(IASTMethod method) { |
| addElement(method); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterTemplateDeclaration(org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration) |
| */ |
| public void enterTemplateDeclaration(IASTTemplateDeclaration declaration) { |
| addElement(declaration); |
| } |
| |
| } |