下面列出了怎么用org.eclipse.jdt.core.dom.ClassInstanceCreation的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public boolean visit(ClassInstanceCreation node) {
if (inFrame) {
List arguments = node.arguments();
if (arguments.size() > 0) {
for (int i = 0; i < arguments.size(); i++) {
Expression exp = (Expression) arguments.get(i);
if (exp instanceof SimpleName) {
AbstractDebugVariableCodeMining<IJavaStackFrame> m = new JavaDebugElementCodeMining(
(SimpleName) exp, fFrame, viewer, provider);
minings.add(m);
}
}
}
}
return super.visit(node);
}
private void updateLabel() {
IMethodBinding calledMethodBinding = ((node instanceof MethodInvocation)
? ((MethodInvocation) node).resolveMethodBinding()
: ((ClassInstanceCreation) node).resolveConstructorBinding());
try {
IMethod method = getMethod(calledMethodBinding);
if (method == null || !acceptMethod(method)) {
super.setLabel("");
} else {
String label = calledMethodBinding != null
? getParameterLabel(method, calledMethodBinding.getDeclaringClass())
: null;
super.setLabel(label != null ? label : "");
}
} catch (JavaModelException e) {
super.setLabel("");
}
}
@Override
public boolean visit(ClassInstanceCreation node) {
/*
* if (Utils.isGeneratedByLombok(node)) { return super.visit(node); }
*/
if (showParameterName || showParameterType) {
List arguments = node.arguments();
if (arguments.size() > 0 && acceptMethod(node)) {
for (int i = 0; i < arguments.size(); i++) {
Expression exp = (Expression) arguments.get(i);
if (showParameterOnlyForLiteral && !isLiteral(exp)) {
continue;
}
minings.add(new JavaMethodParameterCodeMining(node, exp, i, cu, provider, showParameterName,
showParameterType, showParameterByUsingFilters));
}
}
}
return super.visit(node);
}
private boolean duplicatedSliceNodeWithClassInstantiationHasDependenceOnRemovableNode() {
Set<PDGNode> duplicatedNodes = new LinkedHashSet<PDGNode>();
duplicatedNodes.addAll(sliceNodes);
duplicatedNodes.retainAll(indispensableNodes);
for(PDGNode duplicatedNode : duplicatedNodes) {
if(duplicatedNode.containsClassInstanceCreation()) {
Map<VariableDeclaration, ClassInstanceCreation> classInstantiations = duplicatedNode.getClassInstantiations();
for(VariableDeclaration variableDeclaration : classInstantiations.keySet()) {
for(GraphEdge edge : duplicatedNode.outgoingEdges) {
PDGDependence dependence = (PDGDependence)edge;
if(subgraph.edgeBelongsToBlockBasedRegion(dependence) && dependence instanceof PDGDependence) {
PDGDependence dataDependence = (PDGDependence)dependence;
PDGNode dstPDGNode = (PDGNode)dataDependence.dst;
if(removableNodes.contains(dstPDGNode)) {
if(dstPDGNode.changesStateOfReference(variableDeclaration) ||
dstPDGNode.assignsReference(variableDeclaration) || dstPDGNode.accessesReference(variableDeclaration))
return true;
}
}
}
}
}
}
return false;
}
private IMethodBinding getSuperConstructorBinding() {
//workaround for missing java core functionality - finding a
// super constructor for an anonymous class creation
IMethodBinding anonConstr= ((ClassInstanceCreation) fAnonymousInnerClassNode.getParent()).resolveConstructorBinding();
if (anonConstr == null)
return null;
ITypeBinding superClass= anonConstr.getDeclaringClass().getSuperclass();
IMethodBinding[] superMethods= superClass.getDeclaredMethods();
for (int i= 0; i < superMethods.length; i++) {
IMethodBinding superMethod= superMethods[i];
if (superMethod.isConstructor() && parameterTypesMatch(superMethod, anonConstr))
return superMethod;
}
Assert.isTrue(false);//there's no way - it must be there
return null;
}
private ASTNode createNewClassInstanceCreation(CompilationUnitRewrite rewrite, ITypeBinding[] parameters) {
AST ast= fAnonymousInnerClassNode.getAST();
ClassInstanceCreation newClassCreation= ast.newClassInstanceCreation();
newClassCreation.setAnonymousClassDeclaration(null);
Type type= null;
SimpleName newNameNode= ast.newSimpleName(fClassName);
if (parameters.length > 0) {
final ParameterizedType parameterized= ast.newParameterizedType(ast.newSimpleType(newNameNode));
for (int index= 0; index < parameters.length; index++)
parameterized.typeArguments().add(ast.newSimpleType(ast.newSimpleName(parameters[index].getName())));
type= parameterized;
} else
type= ast.newSimpleType(newNameNode);
newClassCreation.setType(type);
copyArguments(rewrite, newClassCreation);
addArgumentsForLocalsUsedInInnerClass(newClassCreation);
addLinkedPosition(KEY_TYPE_NAME, newNameNode, rewrite.getASTRewrite(), true);
return newClassCreation;
}
protected String getFullTypeName() {
ASTNode node= getNode();
while (true) {
node= node.getParent();
if (node instanceof AbstractTypeDeclaration) {
String typeName= ((AbstractTypeDeclaration) node).getName().getIdentifier();
if (getNode() instanceof LambdaExpression) {
return Messages.format(RefactoringCoreMessages.ChangeSignatureRefactoring_lambda_expression, typeName);
}
return typeName;
} else if (node instanceof ClassInstanceCreation) {
ClassInstanceCreation cic= (ClassInstanceCreation) node;
return Messages.format(RefactoringCoreMessages.ChangeSignatureRefactoring_anonymous_subclass, BasicElementLabels.getJavaElementName(ASTNodes.asString(cic.getType())));
} else if (node instanceof EnumConstantDeclaration) {
EnumDeclaration ed= (EnumDeclaration) node.getParent();
return Messages.format(RefactoringCoreMessages.ChangeSignatureRefactoring_anonymous_subclass, BasicElementLabels.getJavaElementName(ASTNodes.asString(ed.getName())));
}
}
}
private boolean duplicatedSliceNodeWithClassInstantiationHasDependenceOnRemovableNode() {
Set<PDGNode> duplicatedNodes = new LinkedHashSet<PDGNode>();
duplicatedNodes.addAll(sliceNodes);
duplicatedNodes.retainAll(indispensableNodes);
for(PDGNode duplicatedNode : duplicatedNodes) {
if(duplicatedNode.containsClassInstanceCreation()) {
Map<VariableDeclaration, ClassInstanceCreation> classInstantiations = duplicatedNode.getClassInstantiations();
for(VariableDeclaration variableDeclaration : classInstantiations.keySet()) {
for(GraphEdge edge : duplicatedNode.outgoingEdges) {
PDGDependence dependence = (PDGDependence)edge;
if(subgraph.edgeBelongsToBlockBasedRegion(dependence) && dependence instanceof PDGDependence) {
PDGDependence dataDependence = (PDGDependence)dependence;
PDGNode dstPDGNode = (PDGNode)dataDependence.dst;
if(removableNodes.contains(dstPDGNode)) {
if(dstPDGNode.changesStateOfReference(variableDeclaration) ||
dstPDGNode.assignsReference(variableDeclaration) || dstPDGNode.accessesReference(variableDeclaration))
return true;
}
}
}
}
}
}
return false;
}
private MethodDeclaration createRunMethodDeclaration(ASTRewrite rewrite, ClassInstanceCreation classLoaderCreation) {
AST ast = rewrite.getAST();
MethodDeclaration methodDeclaration = ast.newMethodDeclaration();
SimpleName methodName = ast.newSimpleName("run");
Type returnType = (Type) rewrite.createCopyTarget(classLoaderCreation.getType());
Block methodBody = createRunMethodBody(rewrite, classLoaderCreation);
List<Modifier> modifiers = checkedList(methodDeclaration.modifiers());
modifiers.add(ast.newModifier(PUBLIC_KEYWORD));
methodDeclaration.setName(methodName);
methodDeclaration.setReturnType2(returnType);
methodDeclaration.setBody(methodBody);
return methodDeclaration;
}
protected MethodInvocation createValueOfInvocation(ASTRewrite rewrite, CompilationUnit compilationUnit,
ClassInstanceCreation primitiveTypeCreation) {
Assert.isNotNull(rewrite);
Assert.isNotNull(primitiveTypeCreation);
final AST ast = rewrite.getAST();
MethodInvocation valueOfInvocation = ast.newMethodInvocation();
valueOfInvocation.setName(ast.newSimpleName(VALUE_OF_METHOD_NAME));
ITypeBinding binding = primitiveTypeCreation.getType().resolveBinding();
if (isStaticImport()) {
addStaticImports(rewrite, compilationUnit, binding.getQualifiedName() + "." + VALUE_OF_METHOD_NAME);
} else {
valueOfInvocation.setExpression(ast.newSimpleName(binding.getName()));
}
List<?> arguments = primitiveTypeCreation.arguments();
List<Expression> newArguments = valueOfInvocation.arguments();
for (Object argument : arguments) {
Expression expression = (Expression) rewrite.createCopyTarget((ASTNode) argument);
newArguments.add(expression);
}
return valueOfInvocation;
}
public static ITypeBinding[] getInferredTypeArguments(Expression invocation) {
IMethodBinding methodBinding;
switch (invocation.getNodeType()) {
case ASTNode.METHOD_INVOCATION:
methodBinding= ((MethodInvocation) invocation).resolveMethodBinding();
return methodBinding == null ? null : methodBinding.getTypeArguments();
case ASTNode.SUPER_METHOD_INVOCATION:
methodBinding= ((SuperMethodInvocation) invocation).resolveMethodBinding();
return methodBinding == null ? null : methodBinding.getTypeArguments();
case ASTNode.CLASS_INSTANCE_CREATION:
Type type= ((ClassInstanceCreation) invocation).getType();
ITypeBinding typeBinding= type.resolveBinding();
return typeBinding == null ? null : typeBinding.getTypeArguments();
default:
throw new IllegalArgumentException(invocation.toString());
}
}
public static ChildListPropertyDescriptor getArgumentsProperty(ASTNode invocation) {
switch (invocation.getNodeType()) {
case ASTNode.METHOD_INVOCATION:
return MethodInvocation.ARGUMENTS_PROPERTY;
case ASTNode.SUPER_METHOD_INVOCATION:
return SuperMethodInvocation.ARGUMENTS_PROPERTY;
case ASTNode.CONSTRUCTOR_INVOCATION:
return ConstructorInvocation.ARGUMENTS_PROPERTY;
case ASTNode.SUPER_CONSTRUCTOR_INVOCATION:
return SuperConstructorInvocation.ARGUMENTS_PROPERTY;
case ASTNode.CLASS_INSTANCE_CREATION:
return ClassInstanceCreation.ARGUMENTS_PROPERTY;
case ASTNode.ENUM_CONSTANT_DECLARATION:
return EnumConstantDeclaration.ARGUMENTS_PROPERTY;
default:
throw new IllegalArgumentException(invocation.toString());
}
}
/**
* handles new Class()
*/
@SuppressWarnings("unchecked")
@Override
public boolean visit(ClassInstanceCreation node) {
IMethodBinding binding = node.resolveConstructorBinding();
if (binding != null) {
Invocation invocation = importer.createInvocationFromMethodBinding(binding, node.toString().trim());
importer.createLightweightSourceAnchor(invocation, node.getType());
} else {
String name = node.getType().toString();
importer.ensureBasicMethod(name, name, importer.ensureTypeNamedInUnknownNamespace(name),
m -> importer.createInvocationToMethod(m, node.toString().trim()));
}
node.arguments().stream().forEach(arg -> importer.createAccessFromExpression((Expression) arg));
return true;
}
@Override
public boolean visit(final ClassInstanceCreation node) {
Assert.isNotNull(node);
if (fCreateInstanceField) {
final AST ast= node.getAST();
final Type type= node.getType();
final ITypeBinding binding= type.resolveBinding();
if (binding != null && binding.getDeclaringClass() != null && !Bindings.equals(binding, fTypeBinding) && fSourceRewrite.getRoot().findDeclaringNode(binding) != null) {
if (!Modifier.isStatic(binding.getModifiers())) {
Expression expression= null;
if (fCodeGenerationSettings.useKeywordThis || fEnclosingInstanceFieldName.equals(fNameForEnclosingInstanceConstructorParameter)) {
final FieldAccess access= ast.newFieldAccess();
access.setExpression(ast.newThisExpression());
access.setName(ast.newSimpleName(fEnclosingInstanceFieldName));
expression= access;
} else
expression= ast.newSimpleName(fEnclosingInstanceFieldName);
if (node.getExpression() != null)
fSourceRewrite.getImportRemover().registerRemovedNode(node.getExpression());
fSourceRewrite.getASTRewrite().set(node, ClassInstanceCreation.EXPRESSION_PROPERTY, expression, fGroup);
} else
addTypeQualification(type, fSourceRewrite, fGroup);
}
}
return true;
}
@Override
protected Expression createMemberAccessExpression(Object member, boolean ignoreArraysCollections, boolean ignoreNulls) {
ITypeBinding type= getMemberType(member);
if (!getContext().is50orHigher() && type.isPrimitive()) {
String nonPrimitiveType= null;
String typeName= type.getName();
if (typeName.equals("byte"))nonPrimitiveType= "java.lang.Byte"; //$NON-NLS-1$ //$NON-NLS-2$
if (typeName.equals("short"))nonPrimitiveType= "java.lang.Short"; //$NON-NLS-1$ //$NON-NLS-2$
if (typeName.equals("char"))nonPrimitiveType= "java.lang.Character"; //$NON-NLS-1$ //$NON-NLS-2$
if (typeName.equals("int"))nonPrimitiveType= "java.lang.Integer"; //$NON-NLS-1$ //$NON-NLS-2$
if (typeName.equals("long"))nonPrimitiveType= "java.lang.Long"; //$NON-NLS-1$ //$NON-NLS-2$
if (typeName.equals("float"))nonPrimitiveType= "java.lang.Float"; //$NON-NLS-1$ //$NON-NLS-2$
if (typeName.equals("double"))nonPrimitiveType= "java.lang.Double"; //$NON-NLS-1$ //$NON-NLS-2$
if (typeName.equals("boolean"))nonPrimitiveType= "java.lang.Boolean"; //$NON-NLS-1$ //$NON-NLS-2$
ClassInstanceCreation classInstance= fAst.newClassInstanceCreation();
classInstance.setType(fAst.newSimpleType(addImport(nonPrimitiveType)));
classInstance.arguments().add(super.createMemberAccessExpression(member, true, true));
return classInstance;
}
return super.createMemberAccessExpression(member, ignoreArraysCollections, ignoreNulls);
}
private boolean duplicatedSliceNodeWithClassInstantiationHasDependenceOnRemovableNode() {
Set<PDGNode> duplicatedNodes = new LinkedHashSet<PDGNode>();
duplicatedNodes.addAll(sliceNodes);
duplicatedNodes.retainAll(indispensableNodes);
for(PDGNode duplicatedNode : duplicatedNodes) {
if(duplicatedNode.containsClassInstanceCreation()) {
Map<VariableDeclaration, ClassInstanceCreation> classInstantiations = duplicatedNode.getClassInstantiations();
for(VariableDeclaration variableDeclaration : classInstantiations.keySet()) {
for(GraphEdge edge : duplicatedNode.outgoingEdges) {
PDGDependence dependence = (PDGDependence)edge;
if(edges.contains(dependence) && dependence instanceof PDGDependence) {
PDGDependence dataDependence = (PDGDependence)dependence;
PDGNode dstPDGNode = (PDGNode)dataDependence.dst;
if(removableNodes.contains(dstPDGNode)) {
if(dstPDGNode.changesStateOfReference(variableDeclaration) ||
dstPDGNode.assignsReference(variableDeclaration) || dstPDGNode.accessesReference(variableDeclaration))
return true;
}
}
}
}
}
}
return false;
}
public boolean match(ClassInstanceCreation node) {
initializeIfNeeded();
for (MethodFilter methodFilter : filters) {
if (methodFilter.match(node)) {
return true;
}
}
return false;
}
private static Expression getBooleanExpression(ASTNode node) {
if (!(node instanceof Expression)) {
return null;
}
// check if the node is a location where it can be negated
StructuralPropertyDescriptor locationInParent= node.getLocationInParent();
if (locationInParent == QualifiedName.NAME_PROPERTY) {
node= node.getParent();
locationInParent= node.getLocationInParent();
}
while (locationInParent == ParenthesizedExpression.EXPRESSION_PROPERTY) {
node= node.getParent();
locationInParent= node.getLocationInParent();
}
Expression expression= (Expression) node;
if (!isBoolean(expression)) {
return null;
}
if (expression.getParent() instanceof InfixExpression) {
return expression;
}
if (locationInParent == Assignment.RIGHT_HAND_SIDE_PROPERTY || locationInParent == IfStatement.EXPRESSION_PROPERTY
|| locationInParent == WhileStatement.EXPRESSION_PROPERTY || locationInParent == DoStatement.EXPRESSION_PROPERTY
|| locationInParent == ReturnStatement.EXPRESSION_PROPERTY || locationInParent == ForStatement.EXPRESSION_PROPERTY
|| locationInParent == AssertStatement.EXPRESSION_PROPERTY || locationInParent == MethodInvocation.ARGUMENTS_PROPERTY
|| locationInParent == ConstructorInvocation.ARGUMENTS_PROPERTY || locationInParent == SuperMethodInvocation.ARGUMENTS_PROPERTY
|| locationInParent == EnumConstantDeclaration.ARGUMENTS_PROPERTY || locationInParent == SuperConstructorInvocation.ARGUMENTS_PROPERTY
|| locationInParent == ClassInstanceCreation.ARGUMENTS_PROPERTY || locationInParent == ConditionalExpression.EXPRESSION_PROPERTY
|| locationInParent == PrefixExpression.OPERAND_PROPERTY) {
return expression;
}
return null;
}
protected void processThrowStatement(ThrowStatement throwStatement) {
Expression expression = throwStatement.getExpression();
if(expression instanceof ClassInstanceCreation) {
ClassInstanceCreation creation = (ClassInstanceCreation)expression;
ITypeBinding typeBinding = creation.getType().resolveBinding();
addExceptionInThrowStatement(typeBinding.getQualifiedName());
}
}
protected void processArgumentsOfInternalClassInstanceCreation(ClassInstanceCreationObject classInstanceCreationObject, AbstractVariable variable) {
SystemObject systemObject = ASTReader.getSystemObject();
ClassInstanceCreation classInstanceCreation = classInstanceCreationObject.getClassInstanceCreation();
IMethodBinding methodBinding = classInstanceCreation.resolveConstructorBinding();
ClassObject classObject = systemObject.getClassObject(classInstanceCreationObject.getType().getClassType());
ConstructorObject constructorObject = null;
if(classObject != null) {
constructorObject = classObject.getConstructor(classInstanceCreationObject);
}
if((classObject == null && !methodBinding.getDeclaringClass().isAnonymous() && !methodBinding.getDeclaringClass().isLocal()) || constructorObject != null) {
//classObject == null && !methodBinding.getDeclaringClass().isAnonymous() => external constructor call that is not an anonymous class declaration
//constructorObject != null => the internal constructor might not exist, in the case the default constructor is called
methodCallAnalyzer.processArgumentsOfInternalMethodInvocation(classObject, constructorObject, classInstanceCreation.arguments(), methodBinding, variable);
}
}
public Block createBody(AST ast, TypeDeclaration originalType) {
ClassInstanceCreation newClassInstanceCreation = ast.newClassInstanceCreation();
newClassInstanceCreation.setType(ast.newSimpleType(ast.newName(originalType.getName().toString())));
newClassInstanceCreation.arguments().add(ast.newThisExpression());
ReturnStatement statement = ast.newReturnStatement();
statement.setExpression(newClassInstanceCreation);
Block block = ast.newBlock();
block.statements().add(statement);
return block;
}
private static ASTNode[] getNodesToDelete(IJavaElement element, CompilationUnit cuNode) throws JavaModelException {
// fields are different because you don't delete the whole declaration but only a fragment of it
if (element.getElementType() == IJavaElement.FIELD) {
if (JdtFlags.isEnum((IField) element))
return new ASTNode[] { ASTNodeSearchUtil.getEnumConstantDeclaration((IField) element, cuNode)};
else
return new ASTNode[] { ASTNodeSearchUtil.getFieldDeclarationFragmentNode((IField) element, cuNode)};
}
if (element.getElementType() == IJavaElement.TYPE && ((IType) element).isLocal()) {
IType type= (IType) element;
if (type.isAnonymous()) {
if (type.getParent().getElementType() == IJavaElement.FIELD) {
EnumConstantDeclaration enumDecl= ASTNodeSearchUtil.getEnumConstantDeclaration((IField) element.getParent(), cuNode);
if (enumDecl != null && enumDecl.getAnonymousClassDeclaration() != null) {
return new ASTNode[] { enumDecl.getAnonymousClassDeclaration() };
}
}
ClassInstanceCreation creation= ASTNodeSearchUtil.getClassInstanceCreationNode(type, cuNode);
if (creation != null) {
if (creation.getLocationInParent() == ExpressionStatement.EXPRESSION_PROPERTY) {
return new ASTNode[] { creation.getParent() };
} else if (creation.getLocationInParent() == VariableDeclarationFragment.INITIALIZER_PROPERTY) {
return new ASTNode[] { creation};
}
return new ASTNode[] { creation.getAnonymousClassDeclaration() };
}
return new ASTNode[0];
} else {
ASTNode[] nodes= ASTNodeSearchUtil.getDeclarationNodes(element, cuNode);
// we have to delete the TypeDeclarationStatement
nodes[0]= nodes[0].getParent();
return nodes;
}
}
return ASTNodeSearchUtil.getDeclarationNodes(element, cuNode);
}
@Override
public boolean visit(ClassInstanceCreation node) {
if (matches(node.resolveConstructorBinding()) && fCurrent != null) {
fCurrent.addInvocation(node);
}
return true;
}
public Block createReturnBlock(AST ast, TypeDeclaration builderType) {
Block builderMethodBlock = ast.newBlock();
ReturnStatement returnStatement = ast.newReturnStatement();
ClassInstanceCreation newClassInstanceCreation = ast.newClassInstanceCreation();
newClassInstanceCreation.setType(ast.newSimpleType(ast.newName(builderType.getName().toString())));
returnStatement.setExpression(newClassInstanceCreation);
builderMethodBlock.statements().add(returnStatement);
return builderMethodBlock;
}
/**
* Returns whether an expression at the given location needs explicit boxing.
*
* @param expression the expression
* @return <code>true</code> iff an expression at the given location needs explicit boxing
* @since 3.6
*/
private static boolean needsExplicitBoxing(Expression expression) {
StructuralPropertyDescriptor locationInParent= expression.getLocationInParent();
if (locationInParent == ParenthesizedExpression.EXPRESSION_PROPERTY)
return needsExplicitBoxing((ParenthesizedExpression) expression.getParent());
if (locationInParent == ClassInstanceCreation.EXPRESSION_PROPERTY
|| locationInParent == FieldAccess.EXPRESSION_PROPERTY
|| locationInParent == MethodInvocation.EXPRESSION_PROPERTY)
return true;
return false;
}
@Override
public void endVisit(ClassInstanceCreation node) {
if (skipNode(node)) {
return;
}
GenericSequentialFlowInfo info = processSequential(node, node.getExpression());
process(info, node.getType());
process(info, node.arguments());
process(info, node.getAnonymousClassDeclaration());
}
private RefactoringStatus checkTempTypeForLocalTypeUsage() throws JavaModelException {
Expression expression = getSelectedExpression().getAssociatedExpression();
Type resultingType = null;
ITypeBinding typeBinding = expression.resolveTypeBinding();
AST ast = fCURewrite.getAST();
if (expression instanceof ClassInstanceCreation && (typeBinding == null || typeBinding.getTypeArguments().length == 0)) {
resultingType = ((ClassInstanceCreation) expression).getType();
} else if (expression instanceof CastExpression) {
resultingType = ((CastExpression) expression).getType();
} else {
if (typeBinding == null) {
typeBinding = ASTResolving.guessBindingForReference(expression);
}
if (typeBinding != null) {
typeBinding = Bindings.normalizeForDeclarationUse(typeBinding, ast);
ImportRewrite importRewrite = fCURewrite.getImportRewrite();
ImportRewriteContext context = new ContextSensitiveImportRewriteContext(expression, importRewrite);
resultingType = importRewrite.addImport(typeBinding, ast, context, TypeLocation.LOCAL_VARIABLE);
} else {
resultingType = ast.newSimpleType(ast.newSimpleName("Object")); //$NON-NLS-1$
}
}
IMethodBinding declaringMethodBinding = getMethodDeclaration().resolveBinding();
ITypeBinding[] methodTypeParameters = declaringMethodBinding == null ? new ITypeBinding[0] : declaringMethodBinding.getTypeParameters();
LocalTypeAndVariableUsageAnalyzer analyzer = new LocalTypeAndVariableUsageAnalyzer(methodTypeParameters);
resultingType.accept(analyzer);
boolean usesLocalTypes = !analyzer.getUsageOfEnclosingNodes().isEmpty();
if (usesLocalTypes) {
return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.ExtractFieldRefactoring_uses_type_declared_locally);
}
return null;
}
private static ASTNode[] getNodesToDelete(IJavaElement element, CompilationUnit cuNode) throws JavaModelException {
// fields are different because you don't delete the whole declaration but only a fragment of it
if (element.getElementType() == IJavaElement.FIELD) {
if (JdtFlags.isEnum((IField) element)) {
return new ASTNode[] { ASTNodeSearchUtil.getEnumConstantDeclaration((IField) element, cuNode)};
} else {
return new ASTNode[] { ASTNodeSearchUtil.getFieldDeclarationFragmentNode((IField) element, cuNode)};
}
}
if (element.getElementType() == IJavaElement.TYPE && ((IType) element).isLocal()) {
IType type= (IType) element;
if (type.isAnonymous()) {
if (type.getParent().getElementType() == IJavaElement.FIELD) {
EnumConstantDeclaration enumDecl= ASTNodeSearchUtil.getEnumConstantDeclaration((IField) element.getParent(), cuNode);
if (enumDecl != null && enumDecl.getAnonymousClassDeclaration() != null) {
return new ASTNode[] { enumDecl.getAnonymousClassDeclaration() };
}
}
ClassInstanceCreation creation= ASTNodeSearchUtil.getClassInstanceCreationNode(type, cuNode);
if (creation != null) {
if (creation.getLocationInParent() == ExpressionStatement.EXPRESSION_PROPERTY) {
return new ASTNode[] { creation.getParent() };
} else if (creation.getLocationInParent() == VariableDeclarationFragment.INITIALIZER_PROPERTY) {
return new ASTNode[] { creation};
}
return new ASTNode[] { creation.getAnonymousClassDeclaration() };
}
return new ASTNode[0];
} else {
ASTNode[] nodes= ASTNodeSearchUtil.getDeclarationNodes(element, cuNode);
// we have to delete the TypeDeclarationStatement
nodes[0]= nodes[0].getParent();
return nodes;
}
}
return ASTNodeSearchUtil.getDeclarationNodes(element, cuNode);
}
@Override
public boolean visit(ClassInstanceCreation node) {
if (!isSelected(node)) {
return false;
}
return handleExceptions(node.resolveConstructorBinding(), node);
}
public boolean isTypeCheckMethodStateSetter() {
InheritanceTree tree = null;
if(existingInheritanceTree != null)
tree = existingInheritanceTree;
else if(inheritanceTreeMatchingWithStaticTypes != null)
tree = inheritanceTreeMatchingWithStaticTypes;
if(tree != null) {
DefaultMutableTreeNode root = tree.getRootNode();
DefaultMutableTreeNode leaf = root.getFirstLeaf();
List<String> subclassNames = new ArrayList<String>();
while(leaf != null) {
subclassNames.add((String)leaf.getUserObject());
leaf = leaf.getNextLeaf();
}
Block typeCheckMethodBody = typeCheckMethod.getBody();
List<Statement> statements = typeCheckMethodBody.statements();
if(statements.size() > 0 && statements.get(0) instanceof SwitchStatement) {
SwitchStatement switchStatement = (SwitchStatement)statements.get(0);
List<Statement> statements2 = switchStatement.statements();
ExpressionExtractor expressionExtractor = new ExpressionExtractor();
int matchCounter = 0;
for(Statement statement2 : statements2) {
if(!(statement2 instanceof SwitchCase) && !(statement2 instanceof BreakStatement)) {
List<Expression> classInstanceCreations = expressionExtractor.getClassInstanceCreations(statement2);
if(classInstanceCreations.size() == 1) {
ClassInstanceCreation classInstanceCreation = (ClassInstanceCreation)classInstanceCreations.get(0);
Type classInstanceCreationType = classInstanceCreation.getType();
if(subclassNames.contains(classInstanceCreationType.resolveBinding().getQualifiedName())) {
matchCounter++;
}
}
}
}
if(matchCounter == subclassNames.size())
return true;
}
}
return false;
}