下面列出了org.eclipse.jdt.core.dom.SingleVariableDeclaration#getInitializer ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private Svd visit(SingleVariableDeclaration node){
int startLine = _cunit.getLineNumber(node.getStartPosition());
int endLine = _cunit.getLineNumber(node.getStartPosition() + node.getLength());
Svd svd = new Svd(startLine, endLine, node);
svd.setDecType(node.getType());
if(node.getInitializer() != null){
Expr initializer = (Expr) process(node.getInitializer());
initializer.setParent(svd);
svd.setInitializer(initializer);
}
SName name = (SName) process(node.getName());
name.setParent(svd);
svd.setName(name);
return svd;
}
public VariableDeclaration(CompilationUnit cu, String filePath, SingleVariableDeclaration fragment) {
this.annotations = new ArrayList<UMLAnnotation>();
List<IExtendedModifier> extendedModifiers = fragment.modifiers();
for(IExtendedModifier extendedModifier : extendedModifiers) {
if(extendedModifier.isAnnotation()) {
Annotation annotation = (Annotation)extendedModifier;
this.annotations.add(new UMLAnnotation(cu, filePath, annotation));
}
}
this.locationInfo = new LocationInfo(cu, filePath, fragment, extractVariableDeclarationType(fragment));
this.variableName = fragment.getName().getIdentifier();
this.initializer = fragment.getInitializer() != null ? new AbstractExpression(cu, filePath, fragment.getInitializer(), CodeElementType.VARIABLE_DECLARATION_INITIALIZER) : null;
Type astType = extractType(fragment);
this.type = UMLType.extractTypeObject(cu, filePath, astType, fragment.getExtraDimensions());
int startOffset = fragment.getStartPosition();
ASTNode scopeNode = getScopeNode(fragment);
int endOffset = scopeNode.getStartPosition() + scopeNode.getLength();
this.scope = new VariableScope(cu, filePath, startOffset, endOffset);
}
@Override
public ITypeConstraint[] create(SingleVariableDeclaration svd){
ITypeConstraint[] defines= fTypeConstraintFactory.createDefinesConstraint(
fConstraintVariableFactory.makeExpressionOrTypeVariable(svd.getName(), getContext()),
fConstraintVariableFactory.makeTypeVariable(svd.getType()));
if (svd.getInitializer() == null)
return defines;
ITypeConstraint[] constraints = fTypeConstraintFactory.createSubtypeConstraint(
fConstraintVariableFactory.makeExpressionOrTypeVariable(svd.getInitializer(), getContext()),
fConstraintVariableFactory.makeExpressionOrTypeVariable(svd.getName(), getContext()));
if (defines.length == 0 && constraints.length == 0){
return new ITypeConstraint[0];
} else if (defines.length == 0){
return constraints;
} else if (constraints.length == 0){
return defines;
} else {
List<ITypeConstraint> all= new ArrayList<ITypeConstraint>();
all.addAll(Arrays.asList(defines));
all.addAll(Arrays.asList(constraints));
return (ITypeConstraint[])all.toArray();
}
}
@Override
public void endVisit(SingleVariableDeclaration node) {
if (skipNode(node)) {
return;
}
IVariableBinding binding = node.resolveBinding();
LocalFlowInfo nameInfo = null;
Expression initializer = node.getInitializer();
if (binding != null && !binding.isField() && initializer != null) {
nameInfo = new LocalFlowInfo(binding, FlowInfo.WRITE, fFlowContext);
}
GenericSequentialFlowInfo info = processSequential(node, node.getType(), initializer);
info.merge(nameInfo, fFlowContext);
}
@Override
public boolean visit(final SingleVariableDeclaration it) {
if ((((it.getParent() instanceof MethodDeclaration) || (it.getParent() instanceof CatchClause)) ||
(it.getParent() instanceof EnhancedForStatement))) {
final Function1<IExtendedModifier, Boolean> _function = (IExtendedModifier it_1) -> {
return Boolean.valueOf(it_1.isAnnotation());
};
this.appendModifiers(it, IterableExtensions.<IExtendedModifier>filter(Iterables.<IExtendedModifier>filter(it.modifiers(), IExtendedModifier.class), _function));
} else {
this.appendModifiers(it, it.modifiers());
}
it.getType().accept(this);
this.appendExtraDimensions(it.getExtraDimensions());
boolean _isVarargs = it.isVarargs();
if (_isVarargs) {
this.appendToBuffer("...");
}
this.appendSpaceToBuffer();
it.getName().accept(this);
Expression _initializer = it.getInitializer();
boolean _tripleNotEquals = (_initializer != null);
if (_tripleNotEquals) {
this.appendToBuffer("=");
it.getInitializer().accept(this);
}
return false;
}
@Override
public final void endVisit(final SingleVariableDeclaration node) {
final ConstraintVariable2 ancestor= (ConstraintVariable2) node.getType().getProperty(PROPERTY_CONSTRAINT_VARIABLE);
if (ancestor != null) {
node.setProperty(PROPERTY_CONSTRAINT_VARIABLE, ancestor);
final Expression expression= node.getInitializer();
if (expression != null) {
final ConstraintVariable2 descendant= (ConstraintVariable2) expression.getProperty(PROPERTY_CONSTRAINT_VARIABLE);
if (descendant != null)
fModel.createSubtypeConstraint(descendant, ancestor);
}
}
}
@Override
public void endVisit(SingleVariableDeclaration node) {
// used for formal method parameters and catch clauses
//TODO: extra dimensions?
// ConstraintVariable2 typeCv= getConstraintVariable(node.getType()); //TODO: who needs this?
// ConstraintVariable2 nameCv;
// switch (node.getParent().getNodeType()) {
// case ASTNode.METHOD_DECLARATION :
// MethodDeclaration parent= (MethodDeclaration) node.getParent();
// int index= parent.parameters().indexOf(node);
// nameCv= fTCFactory.makeParameterTypeVariable(parent.resolveBinding(), index, node.getType());
// //store source range even if variable not used in constraint here. TODO: move to visit(MethodDeclaration)?
// break;
// case ASTNode.CATCH_CLAUSE :
// nameCv= fTCFactory.makeVariableVariable(node.resolveBinding());
//
// break;
// default:
// unexpectedNode(node.getParent());
// }
// setConstraintVariable(node, nameCv);
//TODO: Move this into visit(SimpleName) or leave it here?
// ExpressionVariable2 name= fTCFactory.makeExpressionVariable(node.getName());
// TypeVariable2 type= fTCFactory.makeTypeVariable(node.getType());
// ITypeConstraint2[] nameEqualsType= fTCFactory.createEqualsConstraint(name, type);
// addConstraints(nameEqualsType);
//TODO: When can a SingleVariableDeclaration have an initializer? Never up to Java 1.5?
Expression initializer= node.getInitializer();
if (initializer == null)
return;
// ConstraintVariable2 initializerCv= getConstraintVariable(initializer);
// ConstraintVariable2 nameCv= getConstraintVariable(node);
//TODO: check: property has been set in visit(CatchClause), visit(MethodDeclaration), visit(EnhancedForStatament)
//fTCFactory.createSubtypeConstraint(initializerCv, nameCv); //TODO: not for augment raw container clients
}
@Override
public void endVisit(SingleVariableDeclaration node) {
if (skipNode(node))
return;
IVariableBinding binding= node.resolveBinding();
LocalFlowInfo nameInfo= null;
Expression initializer= node.getInitializer();
if (binding != null && !binding.isField() && initializer != null) {
nameInfo= new LocalFlowInfo(binding, FlowInfo.WRITE, fFlowContext);
}
GenericSequentialFlowInfo info= processSequential(node, node.getType(), initializer);
info.merge(nameInfo, fFlowContext);
}
private static boolean hasSideEffect(SimpleName reference) {
ASTNode parent= reference.getParent();
while (parent instanceof QualifiedName) {
parent= parent.getParent();
}
if (parent instanceof FieldAccess) {
parent= parent.getParent();
}
ASTNode node= null;
int nameParentType= parent.getNodeType();
if (nameParentType == ASTNode.ASSIGNMENT) {
Assignment assignment= (Assignment) parent;
node= assignment.getRightHandSide();
} else if (nameParentType == ASTNode.SINGLE_VARIABLE_DECLARATION) {
SingleVariableDeclaration decl= (SingleVariableDeclaration)parent;
node= decl.getInitializer();
if (node == null)
return false;
} else if (nameParentType == ASTNode.VARIABLE_DECLARATION_FRAGMENT) {
node= parent;
} else {
return false;
}
ArrayList<Expression> sideEffects= new ArrayList<Expression>();
node.accept(new SideEffectFinder(sideEffects));
return sideEffects.size() > 0;
}