1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 18:26:01 +02:00

Fix inconsistent cmodel visibility attributes

This commit is contained in:
Anton Leherbauer 2007-02-08 13:59:01 +00:00
parent f37e2ccc7d
commit dda51e46b3
2 changed files with 107 additions and 61 deletions

View file

@ -858,7 +858,7 @@ public class CModelBuilder2 implements IContributedModelBuilder {
// create the element // create the element
String name= ASTStringUtil.getSimpleName(astTypedefName); String name= ASTStringUtil.getSimpleName(astTypedefName);
TypeDef element= new TypeDef(parent, name); final TypeDef element= new TypeDef(parent, name);
String typeName= ASTStringUtil.getSignatureString(declSpecifier, declarator); String typeName= ASTStringUtil.getSignatureString(declSpecifier, declarator);
element.setTypeName(typeName); element.setTypeName(typeName);
@ -867,15 +867,16 @@ public class CModelBuilder2 implements IContributedModelBuilder {
parent.addChild(element); parent.addChild(element);
// set positions // set positions
final SourceManipulationInfo info= element.getSourceManipulationInfo();
if (name.length() > 0) { if (name.length() > 0) {
setIdentifierPosition(element, astTypedefName); setIdentifierPosition(info, astTypedefName);
} else { } else {
setIdentifierPosition(element, declSpecifier); setIdentifierPosition(info, declSpecifier);
} }
if (declSpecifier instanceof IASTCompositeTypeSpecifier) { if (declSpecifier instanceof IASTCompositeTypeSpecifier) {
setBodyPosition(element, astTypedefName); setBodyPosition(info, astTypedefName);
} else { } else {
setBodyPosition(element, declSpecifier.getParent()); setBodyPosition(info, declSpecifier.getParent());
} }
return element; return element;
} }
@ -895,6 +896,8 @@ public class CModelBuilder2 implements IContributedModelBuilder {
final String variableName= ASTStringUtil.getQualifiedName(astVariableName); final String variableName= ASTStringUtil.getQualifiedName(astVariableName);
final VariableDeclaration element; final VariableDeclaration element;
final SourceManipulationInfo info;
if (declarator instanceof IASTFieldDeclarator || parent instanceof IStructure if (declarator instanceof IASTFieldDeclarator || parent instanceof IStructure
|| CModelBuilder2.getScope(astVariableName) instanceof ICPPClassScope) { || CModelBuilder2.getScope(astVariableName) instanceof ICPPClassScope) {
// field // field
@ -903,8 +906,11 @@ public class CModelBuilder2 implements IContributedModelBuilder {
final ICPPASTDeclSpecifier cppSpecifier= (ICPPASTDeclSpecifier)specifier; final ICPPASTDeclSpecifier cppSpecifier= (ICPPASTDeclSpecifier)specifier;
newElement.setMutable(cppSpecifier.getStorageClass() == ICPPASTDeclSpecifier.sc_mutable); newElement.setMutable(cppSpecifier.getStorageClass() == ICPPASTDeclSpecifier.sc_mutable);
} }
newElement.setVisibility(getCurrentVisibility()); newElement.setTypeName(ASTStringUtil.getSignatureString(specifier, declarator));
final FieldInfo fieldInfo= (FieldInfo)newElement.getElementInfo();
fieldInfo.setVisibility(getCurrentVisibility());
element= newElement; element= newElement;
info= fieldInfo;
} else { } else {
if (isTemplate) { if (isTemplate) {
// template variable // template variable
@ -921,8 +927,9 @@ public class CModelBuilder2 implements IContributedModelBuilder {
element= newElement; element= newElement;
} }
} }
element.setTypeName(ASTStringUtil.getSignatureString(specifier, declarator));
info= element.getSourceManipulationInfo();
} }
element.setTypeName(ASTStringUtil.getSignatureString(specifier, declarator));
element.setConst(specifier.isConst()); element.setConst(specifier.isConst());
element.setVolatile(specifier.isVolatile()); element.setVolatile(specifier.isVolatile());
// TODO [cmodel] correctly resolve isStatic // TODO [cmodel] correctly resolve isStatic
@ -931,12 +938,12 @@ public class CModelBuilder2 implements IContributedModelBuilder {
parent.addChild(element); parent.addChild(element);
// set positions // set positions
setIdentifierPosition(element, astVariableName); setIdentifierPosition(info, astVariableName);
if (!isTemplate) { if (!isTemplate) {
if (specifier instanceof IASTCompositeTypeSpecifier) { if (specifier instanceof IASTCompositeTypeSpecifier) {
setBodyPosition(element, astVariableName); setBodyPosition(info, astVariableName);
} else { } else {
setBodyPosition(element, specifier.getParent()); setBodyPosition(info, specifier.getParent());
} }
} }
return element; return element;
@ -961,8 +968,9 @@ public class CModelBuilder2 implements IContributedModelBuilder {
final String returnType= ASTStringUtil.getTypeString(declSpecifier, declarator); final String returnType= ASTStringUtil.getTypeString(declSpecifier, declarator);
final FunctionDeclaration element; final FunctionDeclaration element;
final FunctionInfo info;
if(declarator instanceof ICPPASTFunctionDeclarator) { if (declarator instanceof ICPPASTFunctionDeclarator) {
final ICPPASTFunctionDeclarator cppFunctionDeclarator= (ICPPASTFunctionDeclarator)declarator; final ICPPASTFunctionDeclarator cppFunctionDeclarator= (ICPPASTFunctionDeclarator)declarator;
final IASTName simpleName; final IASTName simpleName;
@ -999,34 +1007,38 @@ public class CModelBuilder2 implements IContributedModelBuilder {
methodElement= new Method(parent, ASTStringUtil.getQualifiedName(name)); methodElement= new Method(parent, ASTStringUtil.getQualifiedName(name));
} }
element= methodElement; element= methodElement;
// establish identity attributes before getElementInfo()
methodElement.setParameterTypes(parameterTypes);
methodElement.setReturnType(returnType);
methodElement.setConst(cppFunctionDeclarator.isConst());
final MethodInfo methodInfo= methodElement.getMethodInfo();
info= methodInfo;
ICPPMethod methodBinding= null; ICPPMethod methodBinding= null;
if (scope != null) { if (scope != null) {
final IBinding binding= simpleName.getBinding(); final IBinding binding= simpleName.resolveBinding();
if (binding instanceof ICPPMethod) { if (binding instanceof ICPPMethod) {
methodBinding= (ICPPMethod)binding; methodBinding= (ICPPMethod)binding;
} }
} }
if (methodBinding != null) { if (methodBinding != null) {
methodElement.setVirtual(methodBinding.isVirtual()); methodInfo.setVirtual(methodBinding.isVirtual());
methodElement.setInline(methodBinding.isInline()); methodInfo.setInline(methodBinding.isInline());
methodElement.setFriend(((ICPPASTDeclSpecifier)declSpecifier).isFriend()); methodInfo.setFriend(((ICPPASTDeclSpecifier)declSpecifier).isFriend());
methodElement.setVolatile(cppFunctionDeclarator.isVolatile()); methodInfo.setVolatile(cppFunctionDeclarator.isVolatile());
methodElement.setVisibility(adaptVisibilityConstant(methodBinding.getVisibility())); methodInfo.setVisibility(adaptVisibilityConstant(methodBinding.getVisibility()));
methodElement.setConst(cppFunctionDeclarator.isConst()); methodInfo.setPureVirtual(false);
methodElement.setPureVirtual(false);
methodElement.setConstructor(methodBinding instanceof ICPPConstructor); methodElement.setConstructor(methodBinding instanceof ICPPConstructor);
methodElement.setDestructor(methodBinding.isDestructor()); methodElement.setDestructor(methodBinding.isDestructor());
} else { } else {
if (declSpecifier instanceof ICPPASTDeclSpecifier) { if (declSpecifier instanceof ICPPASTDeclSpecifier) {
final ICPPASTDeclSpecifier cppDeclSpecifier= (ICPPASTDeclSpecifier)declSpecifier; final ICPPASTDeclSpecifier cppDeclSpecifier= (ICPPASTDeclSpecifier)declSpecifier;
methodElement.setVirtual(cppDeclSpecifier.isVirtual()); methodInfo.setVirtual(cppDeclSpecifier.isVirtual());
methodElement.setInline(cppDeclSpecifier.isInline()); methodInfo.setInline(cppDeclSpecifier.isInline());
methodElement.setFriend(cppDeclSpecifier.isFriend()); methodInfo.setFriend(cppDeclSpecifier.isFriend());
} }
methodElement.setVolatile(cppFunctionDeclarator.isVolatile()); methodInfo.setVolatile(cppFunctionDeclarator.isVolatile());
methodElement.setVisibility(getCurrentVisibility()); methodInfo.setVisibility(getCurrentVisibility());
methodElement.setConst(cppFunctionDeclarator.isConst()); methodInfo.setPureVirtual(false);
methodElement.setPureVirtual(false);
final boolean isConstructor; final boolean isConstructor;
if (scope != null) { if (scope != null) {
isConstructor= CPPVisitor.isConstructor(scope, declarator); isConstructor= CPPVisitor.isConstructor(scope, declarator);
@ -1044,24 +1056,29 @@ public class CModelBuilder2 implements IContributedModelBuilder {
// function // function
element= new Function(parent, ASTStringUtil.getQualifiedName(name)); element= new Function(parent, ASTStringUtil.getQualifiedName(name));
} }
element.setParameterTypes(parameterTypes);
element.setReturnType(returnType);
info= element.getFunctionInfo();
info.setConst(cppFunctionDeclarator.isConst());
} }
} else { } else {
element= new Function(parent, functionName); element= new Function(parent, functionName);
element.setParameterTypes(parameterTypes);
element.setReturnType(returnType);
info= element.getFunctionInfo();
} }
element.setParameterTypes(parameterTypes);
element.setReturnType(returnType);
// TODO [cmodel] correctly resolve isStatic // TODO [cmodel] correctly resolve isStatic
element.setStatic(declSpecifier.getStorageClass() == IASTDeclSpecifier.sc_static); info.setStatic(declSpecifier.getStorageClass() == IASTDeclSpecifier.sc_static);
// add to parent // add to parent
parent.addChild(element); parent.addChild(element);
// set positions // set positions
setIdentifierPosition(element, name); setIdentifierPosition(info, name);
if (!isTemplate) { if (!isTemplate) {
setBodyPosition(element, functionDeclaration); setBodyPosition(info, functionDeclaration);
} }
return element; return element;
} }
@ -1082,8 +1099,9 @@ public class CModelBuilder2 implements IContributedModelBuilder {
final String returnType= ASTStringUtil.getTypeString(declSpecifier, declarator); final String returnType= ASTStringUtil.getTypeString(declSpecifier, declarator);
final FunctionDeclaration element; final FunctionDeclaration element;
final FunctionInfo info;
if(declarator instanceof ICPPASTFunctionDeclarator) { if (declarator instanceof ICPPASTFunctionDeclarator) {
final ICPPASTFunctionDeclarator cppFunctionDeclarator= (ICPPASTFunctionDeclarator)declarator; final ICPPASTFunctionDeclarator cppFunctionDeclarator= (ICPPASTFunctionDeclarator)declarator;
if (parent instanceof IStructure) { if (parent instanceof IStructure) {
// method // method
@ -1094,16 +1112,21 @@ public class CModelBuilder2 implements IContributedModelBuilder {
methodElement= new MethodDeclaration(parent, functionName); methodElement= new MethodDeclaration(parent, functionName);
} }
element= methodElement; element= methodElement;
// establish identity attributes before getElementInfo()
methodElement.setParameterTypes(parameterTypes);
methodElement.setReturnType(returnType);
methodElement.setConst(cppFunctionDeclarator.isConst());
final MethodInfo methodInfo= methodElement.getMethodInfo();
info= methodInfo;
if (declSpecifier instanceof ICPPASTDeclSpecifier) { if (declSpecifier instanceof ICPPASTDeclSpecifier) {
final ICPPASTDeclSpecifier cppDeclSpecifier= (ICPPASTDeclSpecifier)declSpecifier; final ICPPASTDeclSpecifier cppDeclSpecifier= (ICPPASTDeclSpecifier)declSpecifier;
methodElement.setVirtual(cppDeclSpecifier.isVirtual()); methodInfo.setVirtual(cppDeclSpecifier.isVirtual());
methodElement.setInline(cppDeclSpecifier.isInline()); methodInfo.setInline(cppDeclSpecifier.isInline());
methodElement.setFriend(cppDeclSpecifier.isFriend()); methodInfo.setFriend(cppDeclSpecifier.isFriend());
} }
methodElement.setVolatile(cppFunctionDeclarator.isVolatile()); methodInfo.setVolatile(cppFunctionDeclarator.isVolatile());
methodElement.setVisibility(getCurrentVisibility()); methodInfo.setVisibility(getCurrentVisibility());
methodElement.setConst(cppFunctionDeclarator.isConst()); methodInfo.setPureVirtual(cppFunctionDeclarator.isPureVirtual());
methodElement.setPureVirtual(cppFunctionDeclarator.isPureVirtual());
methodElement.setConstructor(functionName.equals(parent.getElementName())); methodElement.setConstructor(functionName.equals(parent.getElementName()));
methodElement.setDestructor(functionName.charAt(0) == '~'); methodElement.setDestructor(functionName.charAt(0) == '~');
} else { } else {
@ -1112,6 +1135,10 @@ public class CModelBuilder2 implements IContributedModelBuilder {
} else { } else {
element= new FunctionDeclaration(parent, functionName); element= new FunctionDeclaration(parent, functionName);
} }
element.setParameterTypes(parameterTypes);
element.setReturnType(returnType);
info= (FunctionInfo)element.getElementInfo();
info.setConst(cppFunctionDeclarator.isConst());
} }
} else if (declarator instanceof IASTStandardFunctionDeclarator) { } else if (declarator instanceof IASTStandardFunctionDeclarator) {
if (isTemplate) { if (isTemplate) {
@ -1119,23 +1146,24 @@ public class CModelBuilder2 implements IContributedModelBuilder {
} else { } else {
element= new FunctionDeclaration(parent, functionName); element= new FunctionDeclaration(parent, functionName);
} }
element.setParameterTypes(parameterTypes);
element.setReturnType(returnType);
info= (FunctionInfo)element.getElementInfo();
} else { } else {
assert false; assert false;
return null; return null;
} }
element.setParameterTypes(parameterTypes);
element.setReturnType(returnType);
// TODO [cmodel] correctly resolve isStatic // TODO [cmodel] correctly resolve isStatic
element.setStatic(declSpecifier.getStorageClass() == IASTDeclSpecifier.sc_static); info.setStatic(declSpecifier.getStorageClass() == IASTDeclSpecifier.sc_static);
// add to parent // add to parent
parent.addChild(element); parent.addChild(element);
// hook up the offsets // hook up the offsets
setIdentifierPosition(element, name); setIdentifierPosition(info, name);
if (!isTemplate) { if (!isTemplate) {
setBodyPosition(element, declarator); setBodyPosition(info, declarator);
} }
return element; return element;
} }
@ -1173,12 +1201,23 @@ public class CModelBuilder2 implements IContributedModelBuilder {
* *
* @param element * @param element
* @param astNode * @param astNode
* @throws CModelException
*/ */
private void setBodyPosition(SourceManipulation element, IASTNode astNode) { private void setBodyPosition(SourceManipulation element, IASTNode astNode) throws CModelException {
setBodyPosition(element.getSourceManipulationInfo(), astNode);
}
/**
* Utility method to set the body position of an element from an AST node.
*
* @param info
* @param astNode
*/
private void setBodyPosition(SourceManipulationInfo info, IASTNode astNode) {
final IASTFileLocation location= astNode.getFileLocation(); final IASTFileLocation location= astNode.getFileLocation();
if (location != null) { if (location != null) {
element.setPos(location.getNodeOffset(), location.getNodeLength()); info.setPos(location.getNodeOffset(), location.getNodeLength());
element.setLines(location.getStartingLineNumber(), location.getEndingLineNumber()); info.setLines(location.getStartingLineNumber(), location.getEndingLineNumber());
} else { } else {
final IASTNodeLocation[] locations= astNode.getNodeLocations(); final IASTNodeLocation[] locations= astNode.getNodeLocations();
final IASTFileLocation minLocation= getMinFileLocation(locations); final IASTFileLocation minLocation= getMinFileLocation(locations);
@ -1187,10 +1226,10 @@ public class CModelBuilder2 implements IContributedModelBuilder {
if (maxLocation != null) { if (maxLocation != null) {
final int startOffset= minLocation.getNodeOffset(); final int startOffset= minLocation.getNodeOffset();
final int endOffset= maxLocation.getNodeOffset() + maxLocation.getNodeLength(); final int endOffset= maxLocation.getNodeOffset() + maxLocation.getNodeLength();
element.setPos(startOffset, endOffset - startOffset); info.setPos(startOffset, endOffset - startOffset);
final int startLine= minLocation.getStartingLineNumber(); final int startLine= minLocation.getStartingLineNumber();
final int endLine= maxLocation.getEndingLineNumber(); final int endLine= maxLocation.getEndingLineNumber();
element.setLines(startLine, endLine); info.setLines(startLine, endLine);
} }
} }
} }
@ -1201,12 +1240,23 @@ public class CModelBuilder2 implements IContributedModelBuilder {
* *
* @param element * @param element
* @param astName * @param astName
* @throws CModelException
*/ */
private void setIdentifierPosition(SourceManipulation element, IASTNode astName) { private void setIdentifierPosition(SourceManipulation element, IASTNode astName) throws CModelException {
setIdentifierPosition(element.getSourceManipulationInfo(), astName);
}
/**
* Utility method to set the identifier position of an element from an AST name.
*
* @param info
* @param astName
*/
private void setIdentifierPosition(SourceManipulationInfo info, IASTNode astName) {
final IASTFileLocation location= astName.getFileLocation(); final IASTFileLocation location= astName.getFileLocation();
if (location != null) { if (location != null) {
assert fTranslationUnitFileName.equals(location.getFileName()); assert fTranslationUnitFileName.equals(location.getFileName());
element.setIdPos(location.getNodeOffset(), location.getNodeLength()); info.setIdPos(location.getNodeOffset(), location.getNodeLength());
} else { } else {
final IASTNodeLocation[] locations= astName.getNodeLocations(); final IASTNodeLocation[] locations= astName.getNodeLocations();
final IASTFileLocation minLocation= getMinFileLocation(locations); final IASTFileLocation minLocation= getMinFileLocation(locations);
@ -1215,7 +1265,7 @@ public class CModelBuilder2 implements IContributedModelBuilder {
if (maxLocation != null) { if (maxLocation != null) {
final int startOffset= minLocation.getNodeOffset(); final int startOffset= minLocation.getNodeOffset();
final int endOffset= maxLocation.getNodeOffset() + maxLocation.getNodeLength(); final int endOffset= maxLocation.getNodeOffset() + maxLocation.getNodeLength();
element.setIdPos(startOffset, endOffset - startOffset); info.setIdPos(startOffset, endOffset - startOffset);
} }
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2002, 2006 IBM Corporation and others. * Copyright (c) 2002, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -8,6 +8,7 @@
* Contributors: * Contributors:
* Rational Software - Initial API and implementation * Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.model; package org.eclipse.cdt.internal.core.model;
@ -32,15 +33,11 @@ public class MethodDeclaration extends FunctionDeclaration implements IMethodDec
} }
public boolean isConstructor(){ public boolean isConstructor(){
// is not implemented in the parser's quick mode return isConstructor;
//return isConstructor;
return getElementName().equals(getParent().getElementName());
} }
public boolean isDestructor() { public boolean isDestructor() {
// is not implemented in the parser's quick mode return isDestructor;
//return isDestructor;
return getElementName().startsWith("~"); //$NON-NLS-1$
} }
public void setConstructor(boolean isConstructor) { public void setConstructor(boolean isConstructor) {
@ -93,7 +90,6 @@ public class MethodDeclaration extends FunctionDeclaration implements IMethodDec
public void setConst(boolean isConst) throws CModelException{ public void setConst(boolean isConst) throws CModelException{
this.isConst = isConst; this.isConst = isConst;
getMethodInfo().setConst(isConst);
} }
public ASTAccessVisibility getVisibility() throws CModelException{ public ASTAccessVisibility getVisibility() throws CModelException{
@ -108,7 +104,7 @@ public class MethodDeclaration extends FunctionDeclaration implements IMethodDec
return new MethodInfo(this); return new MethodInfo(this);
} }
private MethodInfo getMethodInfo() throws CModelException{ protected MethodInfo getMethodInfo() throws CModelException{
return (MethodInfo) getElementInfo(); return (MethodInfo) getElementInfo();
} }