下面列出了org.eclipse.jdt.core.dom.SuperMethodReference#org.eclipse.jdt.core.dom.ThisExpression 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private FieldAccess wrapAsFieldAccess(SimpleName fieldName, AST ast) {
Name qualifierName = null;
try {
if (isDeclaredInLambdaExpression()) {
String enclosingTypeName = getEnclosingTypeName();
qualifierName = ast.newSimpleName(enclosingTypeName);
}
} catch (JavaModelException e) {
// do nothing.
}
FieldAccess fieldAccess = ast.newFieldAccess();
ThisExpression thisExpression = ast.newThisExpression();
if (qualifierName != null) {
thisExpression.setQualifier(qualifierName);
}
fieldAccess.setExpression(thisExpression);
fieldAccess.setName(fieldName);
return fieldAccess;
}
@Override
public boolean visit(final ThisExpression node) {
Assert.isNotNull(node);
Name name= node.getQualifier();
if (fCreateInstanceField && name != null) {
ITypeBinding binding= node.resolveTypeBinding();
if (binding != null && Bindings.equals(binding, fTypeBinding.getDeclaringClass())) {
AST ast= node.getAST();
Expression expression= null;
if (fCodeGenerationSettings.useKeywordThis || fEnclosingInstanceFieldName.equals(fNameForEnclosingInstanceConstructorParameter)) {
FieldAccess access= ast.newFieldAccess();
access.setExpression(ast.newThisExpression());
access.setName(ast.newSimpleName(fEnclosingInstanceFieldName));
expression= access;
} else {
expression= ast.newSimpleName(fEnclosingInstanceFieldName);
}
fSourceRewrite.getASTRewrite().replace(node, expression, null);
}
}
return super.visit(node);
}
private void modifyAccessToMethodsFromEnclosingInstance(CompilationUnitRewrite targetRewrite, MethodInvocation[] methodInvocations, AbstractTypeDeclaration declaration) {
IMethodBinding binding= null;
MethodInvocation invocation= null;
for (int index= 0; index < methodInvocations.length; index++) {
invocation= methodInvocations[index];
binding= invocation.resolveMethodBinding();
if (binding != null) {
final Expression target= invocation.getExpression();
if (target == null) {
final Expression expression= createAccessExpressionToEnclosingInstanceFieldText(invocation, binding, declaration);
targetRewrite.getASTRewrite().set(invocation, MethodInvocation.EXPRESSION_PROPERTY, expression, null);
} else {
if (!(invocation.getExpression() instanceof ThisExpression) || !(((ThisExpression) invocation.getExpression()).getQualifier() != null))
continue;
targetRewrite.getASTRewrite().replace(target, createAccessExpressionToEnclosingInstanceFieldText(invocation, binding, declaration), null);
targetRewrite.getImportRemover().registerRemovedNode(target);
}
}
}
}
private void checkMethodDeclaration(RefactoringStatus result, int severity) {
MethodDeclaration methodDeclaration= fSourceProvider.getDeclaration();
// it is not allowed to inline constructor invocation only if it is used for class instance creation
// if constructor is invoked from another constructor then we can inline such invocation
if (fInvocation.getNodeType() != ASTNode.CONSTRUCTOR_INVOCATION && methodDeclaration.isConstructor()) {
result.addEntry(new RefactoringStatusEntry(
severity,
RefactoringCoreMessages.CallInliner_constructors,
JavaStatusContext.create(fCUnit, fInvocation)));
}
if (fSourceProvider.hasSuperMethodInvocation() && fInvocation.getNodeType() == ASTNode.METHOD_INVOCATION) {
Expression receiver= ((MethodInvocation)fInvocation).getExpression();
if (receiver instanceof ThisExpression) {
result.addEntry(new RefactoringStatusEntry(
severity,
RefactoringCoreMessages.CallInliner_super_into_this_expression,
JavaStatusContext.create(fCUnit, fInvocation)));
}
}
}
private MethodDeclaration createGetOuterHelper() {
String outerTypeName= fType.getDeclaringClass().getTypeDeclaration().getName();
MethodDeclaration helperMethod= fAst.newMethodDeclaration();
helperMethod.modifiers().addAll(ASTNodeFactory.newModifiers(fAst, Modifier.PRIVATE));
helperMethod.setName(fAst.newSimpleName(METHODNAME_OUTER_TYPE));
helperMethod.setConstructor(false);
helperMethod.setReturnType2(fAst.newSimpleType(fAst.newSimpleName(outerTypeName)));
Block body= fAst.newBlock();
helperMethod.setBody(body);
ThisExpression thisExpression= fAst.newThisExpression();
thisExpression.setQualifier(fAst.newSimpleName(outerTypeName));
ReturnStatement endReturn= fAst.newReturnStatement();
endReturn.setExpression(thisExpression);
body.statements().add(endReturn);
return helperMethod;
}
/**
* {@inheritDoc}
*/
@Override
public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModel model) throws CoreException {
ASTRewrite rewrite= cuRewrite.getASTRewrite();
TextEditGroup group= createTextEditGroup(getDescription(), cuRewrite);
AST ast= rewrite.getAST();
FieldAccess fieldAccess= ast.newFieldAccess();
ThisExpression thisExpression= ast.newThisExpression();
if (fQualifier != null)
thisExpression.setQualifier(ast.newName(fQualifier));
fieldAccess.setExpression(thisExpression);
fieldAccess.setName((SimpleName) rewrite.createMoveTarget(fName));
rewrite.replace(fName, fieldAccess, group);
}
private void qualifyThisExpressions(ASTNode node, final ASTRewrite rewrite, final ImportRewrite importRewrite, final ImportRewriteContext importRewriteContext) {
node.accept(new GenericVisitor() {
/**
* {@inheritDoc}
*/
@Override
public boolean visit(ThisExpression thisExpr) {
if (thisExpr.getQualifier() == null) {
ITypeBinding typeBinding= thisExpr.resolveTypeBinding();
if (typeBinding != null) {
String typeName= importRewrite.addImport(typeBinding.getTypeDeclaration(), importRewriteContext);
SimpleName simpleName= thisExpr.getAST().newSimpleName(typeName);
rewrite.set(thisExpr, ThisExpression.QUALIFIER_PROPERTY, simpleName, null);
}
}
return super.visit(thisExpr);
}
});
}
public boolean containsFieldAccessOfEnclosingClass() {
//check for field access like SegmentedTimeline.this.segmentsIncluded
List<FieldInstructionObject> fieldInstructions = getFieldInstructions();
for(FieldInstructionObject fieldInstruction : fieldInstructions) {
SimpleName simpleName = fieldInstruction.getSimpleName();
if(simpleName.getParent() instanceof FieldAccess) {
FieldAccess fieldAccess = (FieldAccess)simpleName.getParent();
Expression fieldAccessExpression = fieldAccess.getExpression();
if(fieldAccessExpression instanceof ThisExpression) {
ThisExpression thisExpression = (ThisExpression)fieldAccessExpression;
if(thisExpression.getQualifier() != null) {
return true;
}
}
}
}
return false;
}
protected boolean isTypeHolder(Object o) {
if(o.getClass().equals(MethodInvocation.class) || o.getClass().equals(SuperMethodInvocation.class)
|| o.getClass().equals(NumberLiteral.class) || o.getClass().equals(StringLiteral.class)
|| o.getClass().equals(CharacterLiteral.class) || o.getClass().equals(BooleanLiteral.class)
|| o.getClass().equals(TypeLiteral.class) || o.getClass().equals(NullLiteral.class)
|| o.getClass().equals(ArrayCreation.class)
|| o.getClass().equals(ClassInstanceCreation.class)
|| o.getClass().equals(ArrayAccess.class) || o.getClass().equals(FieldAccess.class)
|| o.getClass().equals(SuperFieldAccess.class) || o.getClass().equals(ParenthesizedExpression.class)
|| o.getClass().equals(SimpleName.class) || o.getClass().equals(QualifiedName.class)
|| o.getClass().equals(CastExpression.class) || o.getClass().equals(InfixExpression.class)
|| o.getClass().equals(PrefixExpression.class) || o.getClass().equals(InstanceofExpression.class)
|| o.getClass().equals(ThisExpression.class) || o.getClass().equals(ConditionalExpression.class))
return true;
return false;
}
protected void replaceThisExpressionWithContextParameterInMethodInvocationArguments(List<Expression> newMethodInvocations, AST subclassAST, ASTRewrite subclassRewriter) {
for(Expression expression : newMethodInvocations) {
if(expression instanceof MethodInvocation) {
MethodInvocation newMethodInvocation = (MethodInvocation)expression;
List<Expression> arguments = newMethodInvocation.arguments();
for(Expression argument : arguments) {
if(argument instanceof ThisExpression) {
String parameterName = sourceTypeDeclaration.getName().getIdentifier();
parameterName = parameterName.substring(0,1).toLowerCase() + parameterName.substring(1,parameterName.length());
ListRewrite argumentsRewrite = subclassRewriter.getListRewrite(newMethodInvocation, MethodInvocation.ARGUMENTS_PROPERTY);
argumentsRewrite.replace(argument, subclassAST.newSimpleName(parameterName), null);
}
}
}
}
}
protected void replaceThisExpressionWithContextParameterInClassInstanceCreationArguments(Statement newStatement, AST subclassAST, ASTRewrite subclassRewriter) {
ExpressionExtractor expressionExtractor = new ExpressionExtractor();
List<Expression> classInstanceCreations = expressionExtractor.getClassInstanceCreations(newStatement);
for(Expression creation : classInstanceCreations) {
ClassInstanceCreation classInstanceCreation = (ClassInstanceCreation)creation;
List<Expression> arguments = classInstanceCreation.arguments();
for(Expression argument : arguments) {
if(argument instanceof ThisExpression) {
String parameterName = sourceTypeDeclaration.getName().getIdentifier();
parameterName = parameterName.substring(0,1).toLowerCase() + parameterName.substring(1,parameterName.length());
ListRewrite argumentsRewrite = subclassRewriter.getListRewrite(classInstanceCreation, ClassInstanceCreation.ARGUMENTS_PROPERTY);
argumentsRewrite.replace(argument, subclassAST.newSimpleName(parameterName), null);
}
}
}
}
private void replaceThisExpressionWithSourceClassParameterInMethodInvocationArguments(MethodDeclaration newMethodDeclaration, ASTRewrite targetRewriter) {
ExpressionExtractor extractor = new ExpressionExtractor();
List<Expression> methodInvocations = extractor.getMethodInvocations(newMethodDeclaration.getBody());
for(Expression invocation : methodInvocations) {
if(invocation instanceof MethodInvocation) {
MethodInvocation methodInvocation = (MethodInvocation)invocation;
List<Expression> arguments = methodInvocation.arguments();
for(Expression argument : arguments) {
if(argument instanceof ThisExpression) {
SimpleName parameterName = null;
if(!additionalArgumentsAddedToMovedMethod.contains("this")) {
parameterName = addSourceClassParameterToMovedMethod(newMethodDeclaration, targetRewriter);
}
else {
AST ast = newMethodDeclaration.getAST();
String sourceTypeName = sourceTypeDeclaration.getName().getIdentifier();
parameterName = ast.newSimpleName(sourceTypeName.replaceFirst(Character.toString(sourceTypeName.charAt(0)), Character.toString(Character.toLowerCase(sourceTypeName.charAt(0)))));
}
ListRewrite argumentRewrite = targetRewriter.getListRewrite(methodInvocation, MethodInvocation.ARGUMENTS_PROPERTY);
argumentRewrite.replace(argument, parameterName, null);
}
}
}
}
}
private void replaceThisExpressionWithSourceClassParameterInClassInstanceCreationArguments(MethodDeclaration newMethodDeclaration, ASTRewrite targetRewriter) {
ExpressionExtractor extractor = new ExpressionExtractor();
List<Expression> classInstanceCreations = extractor.getClassInstanceCreations(newMethodDeclaration.getBody());
for(Expression creation : classInstanceCreations) {
ClassInstanceCreation classInstanceCreation = (ClassInstanceCreation)creation;
List<Expression> arguments = classInstanceCreation.arguments();
for(Expression argument : arguments) {
if(argument instanceof ThisExpression) {
SimpleName parameterName = null;
if(!additionalArgumentsAddedToMovedMethod.contains("this")) {
parameterName = addSourceClassParameterToMovedMethod(newMethodDeclaration, targetRewriter);
}
else {
AST ast = newMethodDeclaration.getAST();
String sourceTypeName = sourceTypeDeclaration.getName().getIdentifier();
parameterName = ast.newSimpleName(sourceTypeName.replaceFirst(Character.toString(sourceTypeName.charAt(0)), Character.toString(Character.toLowerCase(sourceTypeName.charAt(0)))));
}
ListRewrite argumentRewrite = targetRewriter.getListRewrite(classInstanceCreation, ClassInstanceCreation.ARGUMENTS_PROPERTY);
argumentRewrite.replace(argument, parameterName, null);
}
}
}
}
private ThisExpr visit(ThisExpression node){
int startLine = _cunit.getLineNumber(node.getStartPosition());
int endLine = _cunit.getLineNumber(node.getStartPosition() + node.getLength());
ThisExpr thisExpr = new ThisExpr(startLine, endLine, node);
Pair<String, String> classAndMethodName = NodeUtils.getTypeDecAndMethodDec(node);
Type type = ProjectInfo.getVariableType(classAndMethodName.getFirst(), classAndMethodName.getSecond(), "THIS");
thisExpr.setType(type);
return thisExpr;
}
public boolean visit(FieldAccess node) {
if (node.getExpression() instanceof ThisExpression) {
if (!this.thisAccesses.contains(node)) {
thisAccesses.add(node);
}
}
return true;
}
@Override
public void endVisit(ThisExpression node) {
if (skipNode(node)) {
return;
}
assignFlowInfo(node, node.getQualifier());
}
@Override
public boolean visit(final ThisExpression it) {
Name _qualifier = it.getQualifier();
boolean _tripleNotEquals = (_qualifier != null);
if (_tripleNotEquals) {
it.getQualifier().accept(this);
this.appendToBuffer(".");
}
this.appendToBuffer("this");
return false;
}
public boolean visit(ThisExpression node) {
if(!(node.getParent() instanceof FieldAccess)) {
variables.add(node.toString());
if(current.getUserObject() != null) {
AnonymousClassDeclarationObject anonymous = (AnonymousClassDeclarationObject)current.getUserObject();
anonymous.getVariables().add(node.toString());
}
}
return super.visit(node);
}
private void processArgument(Expression argument) {
if(argument instanceof SuperMethodInvocation ||
argument instanceof Name ||
argument instanceof StringLiteral ||
argument instanceof BooleanLiteral ||
(argument instanceof FieldAccess && ((FieldAccess)argument).getExpression() instanceof ThisExpression) ||
(argument instanceof ArrayAccess && invalidArrayAccess((ArrayAccess)argument)) ||
(argument instanceof InfixExpression && invalidInfix((InfixExpression)argument)))
return;
this.arguments.add(argument.toString());
if(current.getUserObject() != null) {
AnonymousClassDeclarationObject anonymous = (AnonymousClassDeclarationObject)current.getUserObject();
anonymous.getArguments().add(argument.toString());
}
}
@Override
public boolean visit(ThisExpression node) {
final Name qualifier= node.getQualifier();
if (qualifier != null) {
final ITypeBinding binding= qualifier.resolveTypeBinding();
if (binding != null && binding != fCurrentType.getTypeDeclaration()) {
fSimpleNames.add(qualifier);
}
}
return super.visit(node);
}
private Expression createEnclosingInstanceCreationString(final ASTNode node, final ICompilationUnit cu) throws JavaModelException {
Assert.isTrue((node instanceof ClassInstanceCreation) || (node instanceof SuperConstructorInvocation));
Assert.isNotNull(cu);
Expression expression= null;
if (node instanceof ClassInstanceCreation)
expression= ((ClassInstanceCreation) node).getExpression();
else
expression= ((SuperConstructorInvocation) node).getExpression();
final AST ast= node.getAST();
if (expression != null)
return expression;
else if (JdtFlags.isStatic(fType))
return null;
else if (isInsideSubclassOfDeclaringType(node))
return ast.newThisExpression();
else if ((node.getStartPosition() >= fType.getSourceRange().getOffset() && ASTNodes.getExclusiveEnd(node) <= fType.getSourceRange().getOffset() + fType.getSourceRange().getLength())) {
if (fCodeGenerationSettings.useKeywordThis || fEnclosingInstanceFieldName.equals(fNameForEnclosingInstanceConstructorParameter)) {
final FieldAccess access= ast.newFieldAccess();
access.setExpression(ast.newThisExpression());
access.setName(ast.newSimpleName(fEnclosingInstanceFieldName));
return access;
} else
return ast.newSimpleName(fEnclosingInstanceFieldName);
} else if (isInsideTypeNestedInDeclaringType(node)) {
final ThisExpression qualified= ast.newThisExpression();
qualified.setQualifier(ast.newSimpleName(fType.getDeclaringType().getElementName()));
return qualified;
}
return null;
}
private Expression createQualifiedReadAccessExpressionForEnclosingInstance(AST ast) {
ThisExpression expression= ast.newThisExpression();
expression.setQualifier(ast.newName(new String[] { fType.getElementName()}));
FieldAccess access= ast.newFieldAccess();
access.setExpression(expression);
access.setName(ast.newSimpleName(fEnclosingInstanceFieldName));
return access;
}
@Override
public final boolean visit(final ThisExpression node) {
Assert.isNotNull(node);
if (node.getQualifier() != null) {
fStatus.merge(RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.MoveInstanceMethodProcessor_refers_enclosing_instances, JavaStatusContext.create(fMethod.getCompilationUnit(), node)));
fResult.add(node);
}
return false;
}
@Override
public final boolean visit(final FieldAccess node) {
Assert.isNotNull(node);
final Expression expression= node.getExpression();
final IVariableBinding variable= node.resolveFieldBinding();
final AST ast= fRewrite.getAST();
if (expression instanceof ThisExpression) {
if (Bindings.equals(fTarget, variable)) {
if (fAnonymousClass > 0) {
final ThisExpression target= ast.newThisExpression();
target.setQualifier(ast.newSimpleName(fTargetType.getElementName()));
fRewrite.replace(node, target, null);
} else
fRewrite.replace(node, ast.newThisExpression(), null);
return false;
} else {
expression.accept(this);
return false;
}
} else if (expression instanceof FieldAccess) {
final FieldAccess access= (FieldAccess) expression;
final IBinding binding= access.getName().resolveBinding();
if (access.getExpression() instanceof ThisExpression && Bindings.equals(fTarget, binding)) {
ASTNode newFieldAccess= getFieldReference(node.getName(), fRewrite);
fRewrite.replace(node, newFieldAccess, null);
return false;
}
} else if (expression != null) {
expression.accept(this);
return false;
}
return true;
}
@Override
public final boolean visit(final FieldAccess node) {
Assert.isNotNull(node);
if (node.getExpression() instanceof ThisExpression) {
final IVariableBinding binding= (IVariableBinding) node.getName().resolveBinding();
if (binding != null) {
final String key= binding.getKey();
if (!fFound.contains(key)) {
fFound.add(key);
fBindings.add(binding);
}
}
}
return true;
}
@Override
public final boolean visit(final MethodInvocation node) {
Assert.isNotNull(node);
final Expression expression= node.getExpression();
final IMethodBinding binding= node.resolveMethodBinding();
if (binding == null || !Modifier.isStatic(binding.getModifiers()) && Bindings.equals(binding, fBinding) && (expression == null || expression instanceof ThisExpression)) {
fStatus.merge(RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.MoveInstanceMethodProcessor_potentially_recursive, JavaStatusContext.create(fMethod.getCompilationUnit(), node)));
fResult.add(node);
return false;
}
return true;
}
@Override
public final boolean visit(final ThisExpression node) {
Assert.isNotNull(node);
fResult.add(node);
fStatus.merge(RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.MoveInstanceMethodProcessor_this_reference, JavaStatusContext.create(fMethod.getCompilationUnit(), node)));
return false;
}
@Override
public final boolean visit(final SuperMethodInvocation node) {
if (!fAnonymousClassDeclaration && !fTypeDeclarationStatement) {
final IBinding superBinding= node.getName().resolveBinding();
if (superBinding instanceof IMethodBinding) {
final IMethodBinding extended= (IMethodBinding) superBinding;
if (fEnclosingMethod != null && fEnclosingMethod.overrides(extended))
return true;
final ITypeBinding declaringBinding= extended.getDeclaringClass();
if (declaringBinding != null) {
final IType type= (IType) declaringBinding.getJavaElement();
if (!fSuperReferenceType.equals(type))
return true;
}
}
final AST ast= node.getAST();
final ThisExpression expression= ast.newThisExpression();
final MethodInvocation invocation= ast.newMethodInvocation();
final SimpleName simple= ast.newSimpleName(node.getName().getIdentifier());
invocation.setName(simple);
invocation.setExpression(expression);
final List<Expression> arguments= node.arguments();
if (arguments != null && arguments.size() > 0) {
final ListRewrite rewriter= fRewrite.getListRewrite(invocation, MethodInvocation.ARGUMENTS_PROPERTY);
ListRewrite superRewriter= fRewrite.getListRewrite(node, SuperMethodInvocation.ARGUMENTS_PROPERTY);
ASTNode copyTarget= superRewriter.createCopyTarget(arguments.get(0), arguments.get(arguments.size() - 1));
rewriter.insertLast(copyTarget, null);
}
fRewrite.replace(node, invocation, null);
if (!fSourceRewriter.getCu().equals(fTargetRewriter.getCu()))
fSourceRewriter.getImportRemover().registerRemovedNode(node);
return true;
}
return false;
}
private Expression getSimpleNameReceiver(SimpleName node) {
Expression receiver;
if (node.getParent() instanceof QualifiedName && node.getLocationInParent() == QualifiedName.NAME_PROPERTY) {
receiver= ((QualifiedName) node.getParent()).getQualifier();
} else if (node.getParent() instanceof FieldAccess && node.getLocationInParent() == FieldAccess.NAME_PROPERTY) {
receiver= ((FieldAccess) node.getParent()).getExpression();
} else {
//TODO other cases? (ThisExpression, SuperAccessExpression, ...)
receiver= null;
}
if (receiver instanceof ThisExpression)
return null;
else
return receiver;
}
@Override
public boolean visit(ThisExpression node) {
if (node.getQualifier() != null) {
status.addFatalError(
RefactoringCoreMessages.InlineMethodRefactoring_SourceAnalyzer_qualified_this_expressions,
JavaStatusContext.create(fTypeRoot, node));
return false;
}
return true;
}