blob: e607906ae9b53ccddd2c478cb0a32266013d3938 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.compiler.problem;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.internal.compiler.*;
import org.eclipse.jdt.internal.compiler.ast.*;
import org.eclipse.jdt.internal.compiler.env.IConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
import org.eclipse.jdt.internal.compiler.lookup.*;
import org.eclipse.jdt.internal.compiler.parser.*;
import org.eclipse.jdt.internal.compiler.util.Util;
public class ProblemReporter extends ProblemHandler implements ProblemReasons {
public ReferenceContext referenceContext;
public ProblemReporter(IErrorHandlingPolicy policy, CompilerOptions options, IProblemFactory problemFactory) {
super(policy, options, problemFactory);
}
public void abortDueToInternalError(String errorMessage) {
String[] arguments = new String[] {errorMessage};
this.handle(
IProblem.Unclassified,
arguments,
arguments,
Error | Abort,
0,
0);
}
public void abortDueToInternalError(String errorMessage, ASTNode location) {
String[] arguments = new String[] {errorMessage};
this.handle(
IProblem.Unclassified,
arguments,
arguments,
Error | Abort,
location.sourceStart,
location.sourceEnd);
}
public void abstractMethodCannotBeOverridden(SourceTypeBinding type, MethodBinding concreteMethod) {
this.handle(
// %1 must be abstract since it cannot override the inherited package-private abstract method %2
IProblem.AbstractMethodCannotBeOverridden,
new String[] {
new String(type.sourceName()),
new String(
CharOperation.concat(
concreteMethod.declaringClass.readableName(),
concreteMethod.readableName(),
'.'))},
new String[] {
new String(type.sourceName()),
new String(
CharOperation.concat(
concreteMethod.declaringClass.shortReadableName(),
concreteMethod.shortReadableName(),
'.'))},
type.sourceStart(),
type.sourceEnd());
}
public void abstractMethodInAbstractClass(SourceTypeBinding type, AbstractMethodDeclaration methodDecl) {
String[] arguments = new String[] {new String(type.sourceName()), new String(methodDecl.selector)};
this.handle(
IProblem.AbstractMethodInAbstractClass,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void abstractMethodMustBeImplemented(SourceTypeBinding type, MethodBinding abstractMethod) {
this.handle(
// Must implement the inherited abstract method %1
// 8.4.3 - Every non-abstract subclass of an abstract type, A, must provide a concrete implementation of all of A's methods.
IProblem.AbstractMethodMustBeImplemented,
new String[] {
new String(
CharOperation.concat(
abstractMethod.declaringClass.readableName(),
abstractMethod.readableName(),
'.'))},
new String[] {
new String(
CharOperation.concat(
abstractMethod.declaringClass.shortReadableName(),
abstractMethod.shortReadableName(),
'.'))},
type.sourceStart(),
type.sourceEnd());
}
public void abstractMethodNeedingNoBody(AbstractMethodDeclaration method) {
this.handle(
IProblem.BodyForAbstractMethod,
NoArgument,
NoArgument,
method.sourceStart,
method.sourceEnd,
method,
method.compilationResult());
}
public void alreadyDefinedLabel(char[] labelName, ASTNode location) {
String[] arguments = new String[] {new String(labelName)};
this.handle(
IProblem.DuplicateLabel,
arguments,
arguments,
location.sourceStart,
location.sourceEnd);
}
public void annotationTypeMemberDeclarationWithConstructorName(AnnotationTypeMemberDeclaration annotationTypeMemberDeclaration) {
this.handle(
IProblem.AnnotationButConstructorName,
NoArgument,
NoArgument,
annotationTypeMemberDeclaration.sourceStart,
annotationTypeMemberDeclaration.sourceEnd);
}
public void anonymousClassCannotExtendFinalClass(Expression expression, TypeBinding type) {
this.handle(
IProblem.AnonymousClassCannotExtendFinalClass,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
expression.sourceStart,
expression.sourceEnd);
}
public void argumentTypeCannotBeVoid(SourceTypeBinding type, AbstractMethodDeclaration methodDecl, Argument arg) {
String[] arguments = new String[] {new String(methodDecl.selector), new String(arg.name)};
this.handle(
IProblem.ArgumentTypeCannotBeVoid,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void argumentTypeCannotBeVoidArray(SourceTypeBinding type, AbstractMethodDeclaration methodDecl, Argument arg) {
String[] arguments = new String[] {new String(methodDecl.selector), new String(arg.name)};
this.handle(
IProblem.ArgumentTypeCannotBeVoidArray,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void arrayConstantsOnlyInArrayInitializers(int sourceStart, int sourceEnd) {
this.handle(
IProblem.ArrayConstantsOnlyInArrayInitializers,
NoArgument,
NoArgument,
sourceStart,
sourceEnd);
}
public void assignmentHasNoEffect(Assignment assignment, char[] name){
String[] arguments = new String[] { new String(name) };
this.handle(
IProblem.AssignmentHasNoEffect,
arguments,
arguments,
assignment.sourceStart,
assignment.sourceEnd);
}
public void attemptToReturnNonVoidExpression(ReturnStatement returnStatement, TypeBinding expectedType) {
this.handle(
IProblem.VoidMethodReturnsValue,
new String[] {new String(expectedType.readableName())},
new String[] {new String(expectedType.shortReadableName())},
returnStatement.sourceStart,
returnStatement.sourceEnd);
}
public void attemptToReturnVoidValue(ReturnStatement returnStatement) {
this.handle(
IProblem.MethodReturnsVoid,
NoArgument,
NoArgument,
returnStatement.sourceStart,
returnStatement.sourceEnd);
}
public void boundsMustBeAnInterface(ASTNode location, TypeBinding type) {
this.handle(
IProblem.BoundsMustBeAnInterface,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void bytecodeExceeds64KLimit(AbstractMethodDeclaration location) {
if (location.isConstructor()) {
this.handle(
IProblem.BytecodeExceeds64KLimitForConstructor,
new String[] {new String(location.selector), parametersAsString(location.binding.parameters, false)},
new String[] {new String(location.selector), parametersAsString(location.binding.parameters, true)},
Error | Abort,
location.sourceStart,
location.sourceEnd);
} else {
this.handle(
IProblem.BytecodeExceeds64KLimit,
new String[] {new String(location.selector), parametersAsString(location.binding.parameters, false)},
new String[] {new String(location.selector), parametersAsString(location.binding.parameters, true)},
Error | Abort,
location.sourceStart,
location.sourceEnd);
}
}
public void bytecodeExceeds64KLimit(TypeDeclaration location) {
this.handle(
IProblem.BytecodeExceeds64KLimitForClinit,
NoArgument,
NoArgument,
Error | Abort,
location.sourceStart,
location.sourceEnd);
}
public void cannotAllocateVoidArray(Expression expression) {
this.handle(
IProblem.CannotAllocateVoidArray,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void cannotAssignToFinalField(FieldBinding field, ASTNode location) {
this.handle(
IProblem.FinalFieldAssignment,
new String[] {
(field.declaringClass == null ? "array" : new String(field.declaringClass.readableName())), //$NON-NLS-1$
new String(field.readableName())},
new String[] {
(field.declaringClass == null ? "array" : new String(field.declaringClass.shortReadableName())), //$NON-NLS-1$
new String(field.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void cannotAssignToFinalLocal(LocalVariableBinding local, ASTNode location) {
String[] arguments = new String[] { new String(local.readableName())};
this.handle(
IProblem.NonBlankFinalLocalAssignment,
arguments,
arguments,
location.sourceStart,
location.sourceEnd);
}
public void cannotAssignToFinalOuterLocal(LocalVariableBinding local, ASTNode location) {
String[] arguments = new String[] {new String(local.readableName())};
this.handle(
IProblem.FinalOuterLocalAssignment,
arguments,
arguments,
location.sourceStart,
location.sourceEnd);
}
public void cannotDeclareLocalInterface(char[] interfaceName, int sourceStart, int sourceEnd) {
String[] arguments = new String[] {new String(interfaceName)};
this.handle(
IProblem.CannotDefineInterfaceInLocalType,
arguments,
arguments,
sourceStart,
sourceEnd);
}
public void cannotDefineDimensionsAndInitializer(ArrayAllocationExpression expresssion) {
this.handle(
IProblem.CannotDefineDimensionExpressionsWithInit,
NoArgument,
NoArgument,
expresssion.sourceStart,
expresssion.sourceEnd);
}
public void cannotDireclyInvokeAbstractMethod(MessageSend messageSend, MethodBinding method) {
this.handle(
IProblem.DirectInvocationOfAbstractMethod,
new String[] {new String(method.declaringClass.readableName()), new String(method.selector), parametersAsString(method.parameters, false)},
new String[] {new String(method.declaringClass.shortReadableName()), new String(method.selector), parametersAsString(method.parameters, true)},
messageSend.sourceStart,
messageSend.sourceEnd);
}
public void cannotImportPackage(ImportReference importRef) {
String[] arguments = new String[] {CharOperation.toString(importRef.tokens)};
this.handle(
IProblem.CannotImportPackage,
arguments,
arguments,
importRef.sourceStart,
importRef.sourceEnd);
}
public void cannotInstantiate(TypeReference typeRef, TypeBinding type) {
this.handle(
IProblem.InvalidClassInstantiation,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
typeRef.sourceStart,
typeRef.sourceEnd);
}
public void cannotReferToNonFinalOuterLocal(LocalVariableBinding local, ASTNode location) {
String[] arguments =new String[]{ new String(local.readableName())};
this.handle(
IProblem.OuterLocalMustBeFinal,
arguments,
arguments,
location.sourceStart,
location.sourceEnd);
}
public void cannotReturnInInitializer(ASTNode location) {
this.handle(
IProblem.CannotReturnInInitializer,
NoArgument,
NoArgument,
location.sourceStart,
location.sourceEnd);
}
public void cannotThrowNull(ThrowStatement statement) {
this.handle(
IProblem.CannotThrowNull,
NoArgument,
NoArgument,
statement.sourceStart,
statement.sourceEnd);
}
public void cannotThrowType(SourceTypeBinding type, AbstractMethodDeclaration methodDecl, TypeReference exceptionType, TypeBinding expectedType) {
this.handle(
IProblem.CannotThrowType,
new String[] {new String(expectedType.readableName())},
new String[] {new String(expectedType.shortReadableName())},
exceptionType.sourceStart,
exceptionType.sourceEnd);
}
public void cannotUseSuperInCodeSnippet(int start, int end) {
this.handle(
IProblem.CannotUseSuperInCodeSnippet,
NoArgument,
NoArgument,
Error | Abort,
start,
end);
}
public void cannotUseSuperInJavaLangObject(ASTNode reference) {
this.handle(
IProblem.ObjectHasNoSuperclass,
NoArgument,
NoArgument,
reference.sourceStart,
reference.sourceEnd);
}
public void caseExpressionMustBeConstant(Expression expression) {
this.handle(
IProblem.NonConstantExpression,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void classExtendFinalClass(SourceTypeBinding type, TypeReference superclass, TypeBinding superTypeBinding) {
String name = new String(type.sourceName());
String superTypeFullName = new String(superTypeBinding.readableName());
String superTypeShortName = new String(superTypeBinding.shortReadableName());
if (superTypeShortName.equals(name)) superTypeShortName = superTypeFullName;
this.handle(
IProblem.ClassExtendFinalClass,
new String[] {superTypeFullName, name},
new String[] {superTypeShortName, name},
superclass.sourceStart,
superclass.sourceEnd);
}
public void codeSnippetMissingClass(String missing, int start, int end) {
String[] arguments = new String[]{missing};
this.handle(
IProblem.CodeSnippetMissingClass,
arguments,
arguments,
Error | Abort,
start,
end);
}
public void codeSnippetMissingMethod(String className, String missingMethod, String argumentTypes, int start, int end) {
String[] arguments = new String[]{ className, missingMethod, argumentTypes };
this.handle(
IProblem.CodeSnippetMissingMethod,
arguments,
arguments,
Error | Abort,
start,
end);
}
/*
* Given the current configuration, answers which category the problem
* falls into:
* Error | Warning | Ignore
*/
public int computeSeverity(int problemId){
// severity can have been preset on the problem
// if ((problem.severity & Fatal) != 0){
// return Error;
// }
// if not then check whether it is a configurable problem
switch(problemId){
case IProblem.MaskedCatch :
return this.options.getSeverity(CompilerOptions.MaskedCatchBlock);
case IProblem.UnusedImport :
return this.options.getSeverity(CompilerOptions.UnusedImport);
case IProblem.MethodButWithConstructorName :
return this.options.getSeverity(CompilerOptions.MethodWithConstructorName);
case IProblem.OverridingNonVisibleMethod :
return this.options.getSeverity(CompilerOptions.OverriddenPackageDefaultMethod);
case IProblem.IncompatibleReturnTypeForNonInheritedInterfaceMethod :
case IProblem.IncompatibleExceptionInThrowsClauseForNonInheritedInterfaceMethod :
return this.options.getSeverity(CompilerOptions.IncompatibleNonInheritedInterfaceMethod);
case IProblem.OverridingDeprecatedMethod :
case IProblem.UsingDeprecatedType :
case IProblem.UsingDeprecatedMethod :
case IProblem.UsingDeprecatedConstructor :
case IProblem.UsingDeprecatedField :
return this.options.getSeverity(CompilerOptions.UsingDeprecatedAPI);
case IProblem.LocalVariableIsNeverUsed :
return this.options.getSeverity(CompilerOptions.UnusedLocalVariable);
case IProblem.ArgumentIsNeverUsed :
return this.options.getSeverity(CompilerOptions.UnusedArgument);
case IProblem.NoImplicitStringConversionForCharArrayExpression :
return this.options.getSeverity(CompilerOptions.NoImplicitStringConversion);
case IProblem.NeedToEmulateFieldReadAccess :
case IProblem.NeedToEmulateFieldWriteAccess :
case IProblem.NeedToEmulateMethodAccess :
case IProblem.NeedToEmulateConstructorAccess :
return this.options.getSeverity(CompilerOptions.AccessEmulation);
case IProblem.NonExternalizedStringLiteral :
return this.options.getSeverity(CompilerOptions.NonExternalizedString);
case IProblem.UseAssertAsAnIdentifier :
return this.options.getSeverity(CompilerOptions.AssertUsedAsAnIdentifier);
case IProblem.UseEnumAsAnIdentifier :
return this.options.getSeverity(CompilerOptions.EnumUsedAsAnIdentifier);
case IProblem.NonStaticAccessToStaticMethod :
case IProblem.NonStaticAccessToStaticField :
return this.options.getSeverity(CompilerOptions.NonStaticAccessToStatic);
case IProblem.IndirectAccessToStaticMethod :
case IProblem.IndirectAccessToStaticField :
case IProblem.IndirectAccessToStaticType :
return this.options.getSeverity(CompilerOptions.IndirectStaticAccess);
case IProblem.AssignmentHasNoEffect:
return this.options.getSeverity(CompilerOptions.NoEffectAssignment);
case IProblem.UnusedPrivateConstructor:
case IProblem.UnusedPrivateMethod:
case IProblem.UnusedPrivateField:
case IProblem.UnusedPrivateType:
return this.options.getSeverity(CompilerOptions.UnusedPrivateMember);
case IProblem.Task :
return Warning;
case IProblem.LocalVariableHidingLocalVariable:
case IProblem.LocalVariableHidingField:
case IProblem.ArgumentHidingLocalVariable:
case IProblem.ArgumentHidingField:
return this.options.getSeverity(CompilerOptions.LocalVariableHiding);
case IProblem.FieldHidingLocalVariable:
case IProblem.FieldHidingField:
return this.options.getSeverity(CompilerOptions.FieldHiding);
case IProblem.PossibleAccidentalBooleanAssignment:
return this.options.getSeverity(CompilerOptions.AccidentalBooleanAssign);
case IProblem.SuperfluousSemicolon:
case IProblem.EmptyControlFlowStatement:
return this.options.getSeverity(CompilerOptions.EmptyStatement);
case IProblem.UndocumentedEmptyBlock:
return this.options.getSeverity(CompilerOptions.UndocumentedEmptyBlock);
case IProblem.UnnecessaryCast:
case IProblem.UnnecessaryArgumentCast:
case IProblem.UnnecessaryInstanceof:
return this.options.getSeverity(CompilerOptions.UnnecessaryTypeCheck);
case IProblem.FinallyMustCompleteNormally:
return this.options.getSeverity(CompilerOptions.FinallyBlockNotCompleting);
case IProblem.UnusedMethodDeclaredThrownException:
case IProblem.UnusedConstructorDeclaredThrownException:
return this.options.getSeverity(CompilerOptions.UnusedDeclaredThrownException);
case IProblem.UnqualifiedFieldAccess:
return this.options.getSeverity(CompilerOptions.UnqualifiedFieldAccess);
case IProblem.UnnecessaryElse:
return this.options.getSeverity(CompilerOptions.UnnecessaryElse);
case IProblem.UnsafeRawConstructorInvocation:
case IProblem.UnsafeRawMethodInvocation:
case IProblem.UnsafeRawConversion:
case IProblem.UnsafeRawFieldAssignment:
case IProblem.UnsafeGenericCast:
case IProblem.UnsafeReturnTypeOverride:
return this.options.getSeverity(CompilerOptions.UnsafeTypeOperation);
case IProblem.FinalBoundForTypeVariable:
return this.options.getSeverity(CompilerOptions.FinalParameterBound);
case IProblem.MissingSerialVersion:
return this.options.getSeverity(CompilerOptions.MissingSerialVersion);
case IProblem.ForbiddenReference:
return this.options.getSeverity(CompilerOptions.ForbiddenReference);
/*
* Javadoc syntax errors
*/
case IProblem.JavadocUnexpectedTag:
case IProblem.JavadocDuplicateReturnTag:
case IProblem.JavadocInvalidThrowsClass:
case IProblem.JavadocInvalidReference:
case IProblem.JavadocMalformedSeeReference:
case IProblem.JavadocInvalidSeeHref:
case IProblem.JavadocInvalidSeeArgs:
case IProblem.JavadocInvalidTag:
case IProblem.JavadocUnterminatedInlineTag:
case IProblem.JavadocMissingHashCharacter:
case IProblem.JavadocEmptyReturnTag:
case IProblem.JavadocUnexpectedText:
if (this.options.docCommentSupport) {
return this.options.getSeverity(CompilerOptions.InvalidJavadoc);
} else {
return ProblemSeverities.Ignore;
}
/*
* Javadoc tags resolved references errors
*/
case IProblem.JavadocInvalidParamName:
case IProblem.JavadocDuplicateParamName:
case IProblem.JavadocMissingParamName:
case IProblem.JavadocInvalidThrowsClassName:
case IProblem.JavadocDuplicateThrowsClassName:
case IProblem.JavadocMissingThrowsClassName:
case IProblem.JavadocMissingReference:
case IProblem.JavadocInvalidValueReference:
case IProblem.JavadocUsingDeprecatedField:
case IProblem.JavadocUsingDeprecatedConstructor:
case IProblem.JavadocUsingDeprecatedMethod:
case IProblem.JavadocUsingDeprecatedType:
case IProblem.JavadocUndefinedField:
case IProblem.JavadocNotVisibleField:
case IProblem.JavadocAmbiguousField:
case IProblem.JavadocUndefinedConstructor:
case IProblem.JavadocNotVisibleConstructor:
case IProblem.JavadocAmbiguousConstructor:
case IProblem.JavadocUndefinedMethod:
case IProblem.JavadocNotVisibleMethod:
case IProblem.JavadocAmbiguousMethod:
case IProblem.JavadocAmbiguousMethodReference:
case IProblem.JavadocParameterMismatch:
case IProblem.JavadocUndefinedType:
case IProblem.JavadocNotVisibleType:
case IProblem.JavadocAmbiguousType:
case IProblem.JavadocInternalTypeNameProvided:
case IProblem.JavadocNoMessageSendOnArrayType:
case IProblem.JavadocNoMessageSendOnBaseType:
case IProblem.JavadocInheritedMethodHidesEnclosingName:
case IProblem.JavadocInheritedFieldHidesEnclosingName:
case IProblem.JavadocInheritedNameHidesEnclosingTypeName:
if (this.options.docCommentSupport && this.options.reportInvalidJavadocTags) {
return this.options.getSeverity(CompilerOptions.InvalidJavadoc);
} else {
return ProblemSeverities.Ignore;
}
/*
* Javadoc missing tags errors
*/
case IProblem.JavadocMissingParamTag:
case IProblem.JavadocMissingReturnTag:
case IProblem.JavadocMissingThrowsTag:
if (this.options.docCommentSupport) {
return this.options.getSeverity(CompilerOptions.MissingJavadocTags);
} else {
return ProblemSeverities.Ignore;
}
/*
* Missing Javadoc errors
*/
case IProblem.JavadocMissing:
if (this.options.docCommentSupport) {
return this.options.getSeverity(CompilerOptions.MissingJavadocComments);
} else {
return ProblemSeverities.Ignore;
}
// by default problems are errors.
default:
return Error;
}
}
public void conditionalArgumentsIncompatibleTypes(ConditionalExpression expression, TypeBinding trueType, TypeBinding falseType) {
this.handle(
IProblem.IncompatibleTypesInConditionalOperator,
new String[] {new String(trueType.readableName()), new String(falseType.readableName())},
new String[] {new String(trueType.sourceName()), new String(falseType.sourceName())},
expression.sourceStart,
expression.sourceEnd);
}
public void conflictingImport(ImportReference importRef) {
String[] arguments = new String[] {CharOperation.toString(importRef.tokens)};
this.handle(
IProblem.ConflictingImport,
arguments,
arguments,
importRef.sourceStart,
importRef.sourceEnd);
}
public void constantOutOfFormat(NumberLiteral literal) {
// the literal is not in a correct format
// this code is called on IntLiteral and LongLiteral
// example 000811 ...the 8 is uncorrect.
if ((literal instanceof LongLiteral) || (literal instanceof IntLiteral)) {
char[] source = literal.source();
try {
final String Radix;
final int radix;
if ((source[1] == 'x') || (source[1] == 'X')) {
radix = 16;
Radix = "Hex"; //$NON-NLS-1$
} else {
radix = 8;
Radix = "Octal"; //$NON-NLS-1$
}
//look for the first digit that is incorrect
int place = -1;
label : for (int i = radix == 8 ? 1 : 2; i < source.length; i++) {
if (Character.digit(source[i], radix) == -1) {
place = i;
break label;
}
}
String[] arguments = new String[] {
new String(literal.literalType(null).readableName()), // numeric literals do not need scope to reach type
Radix + " " + new String(source) + " (digit " + new String(new char[] {source[place]}) + ")"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
this.handle(
IProblem.NumericValueOutOfRange,
arguments,
arguments,
literal.sourceStart,
literal.sourceEnd);
return;
} catch (IndexOutOfBoundsException ex) {
// should never happen
}
// just in case .... use a predefined error..
// we should never come here...(except if the code changes !)
this.constantOutOfRange(literal, literal.literalType(null)); // numeric literals do not need scope to reach type
}
}
public void constantOutOfRange(Literal literal, TypeBinding literalType) {
String[] arguments = new String[] {new String(literalType.readableName()), new String(literal.source())};
this.handle(
IProblem.NumericValueOutOfRange,
arguments,
arguments,
literal.sourceStart,
literal.sourceEnd);
}
public void corruptedSignature(TypeBinding enclosingType, char[] signature, int position) {
this.handle(
IProblem.CorruptedSignature,
new String[] { new String(enclosingType.readableName()), new String(signature), String.valueOf(position) },
new String[] { new String(enclosingType.shortReadableName()), new String(signature), String.valueOf(position) },
Error | Abort,
0,
0);
}
public void deprecatedField(FieldBinding field, ASTNode location) {
this.handle(
IProblem.UsingDeprecatedField,
new String[] {new String(field.declaringClass.readableName()), new String(field.name)},
new String[] {new String(field.declaringClass.shortReadableName()), new String(field.name)},
location.sourceStart,
location.sourceEnd);
}
public void deprecatedMethod(MethodBinding method, ASTNode location) {
if (method.isConstructor()) {
this.handle(
IProblem.UsingDeprecatedConstructor,
new String[] {new String(method.declaringClass.readableName()), parametersAsString(method.parameters, false)},
new String[] {new String(method.declaringClass.shortReadableName()), parametersAsString(method.parameters, true)},
location.sourceStart,
location.sourceEnd);
} else {
this.handle(
IProblem.UsingDeprecatedMethod,
new String[] {new String(method.declaringClass.readableName()), new String(method.selector), parametersAsString(method.parameters, false)},
new String[] {new String(method.declaringClass.shortReadableName()), new String(method.selector), parametersAsString(method.parameters, true)},
location.sourceStart,
location.sourceEnd);
}
}
public void deprecatedType(TypeBinding type, ASTNode location) {
if (location == null) return; // 1G828DN - no type ref for synthetic arguments
this.handle(
IProblem.UsingDeprecatedType,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void duplicateCase(CaseStatement caseStatement) {
this.handle(
IProblem.DuplicateCase,
NoArgument,
NoArgument,
caseStatement.sourceStart,
caseStatement.sourceEnd);
}
public void duplicateDefaultCase(ASTNode statement) {
this.handle(
IProblem.DuplicateDefaultCase,
NoArgument,
NoArgument,
statement.sourceStart,
statement.sourceEnd);
}
public void duplicateFieldInType(SourceTypeBinding type, FieldDeclaration fieldDecl) {
this.handle(
IProblem.DuplicateField,
new String[] {new String(type.sourceName()), new String(fieldDecl.name)},
new String[] {new String(type.shortReadableName()), new String(fieldDecl.name)},
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void duplicateImport(ImportReference importRef) {
String[] arguments = new String[] {CharOperation.toString(importRef.tokens)};
this.handle(
IProblem.DuplicateImport,
arguments,
arguments,
importRef.sourceStart,
importRef.sourceEnd);
}
public void duplicateInitializationOfBlankFinalField(FieldBinding field, Reference reference) {
String[] arguments = new String[]{ new String(field.readableName())};
this.handle(
IProblem.DuplicateBlankFinalFieldInitialization,
arguments,
arguments,
reference.sourceStart,
reference.sourceEnd);
}
public void duplicateInitializationOfFinalLocal(LocalVariableBinding local, ASTNode location) {
String[] arguments = new String[] { new String(local.readableName())};
this.handle(
IProblem.DuplicateFinalLocalInitialization,
arguments,
arguments,
location.sourceStart,
location.sourceEnd);
}
public void duplicateMethodInType(SourceTypeBinding type, AbstractMethodDeclaration methodDecl) {
MethodBinding method = methodDecl.binding;
boolean duplicateErasure = false;
if ((method.modifiers & CompilerModifiers.AccGenericSignature) != 0) {
// chech it occurs in parameters (the bit is set for return type | params | thrown exceptions
for (int i = 0, length = method.parameters.length; i < length; i++) {
if ((method.parameters[i].tagBits & TagBits.HasTypeVariable) != 0) {
duplicateErasure = true;
break;
}
}
}
if (duplicateErasure) {
int length = method.parameters.length;
TypeBinding[] erasures = new TypeBinding[length];
for (int i = 0; i < length; i++) {
erasures[i] = method.parameters[i].erasure();
}
this.handle(
IProblem.DuplicateMethodErasure,
new String[] {
new String(methodDecl.selector),
new String(method.declaringClass.readableName()),
parametersAsString(method.parameters, false),
parametersAsString(erasures, false) } ,
new String[] {
new String(methodDecl.selector),
new String(method.declaringClass.shortReadableName()),
parametersAsString(method.parameters, true),
parametersAsString(erasures, true) },
methodDecl.sourceStart,
methodDecl.sourceEnd);
} else {
this.handle(
IProblem.DuplicateMethod,
new String[] {
new String(methodDecl.selector),
new String(method.declaringClass.readableName()),
parametersAsString(method.parameters, false)},
new String[] {
new String(methodDecl.selector),
new String(method.declaringClass.shortReadableName()),
parametersAsString(method.parameters, true)},
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
}
public void duplicateModifierForField(ReferenceBinding type, FieldDeclaration fieldDecl) {
/* to highlight modifiers use:
this.handle(
new Problem(
DuplicateModifierForField,
new String[] {new String(fieldDecl.name)},
fieldDecl.modifiers.sourceStart,
fieldDecl.modifiers.sourceEnd));
*/
String[] arguments = new String[] {new String(fieldDecl.name)};
this.handle(
IProblem.DuplicateModifierForField,
arguments,
arguments,
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void duplicateModifierForMethod(ReferenceBinding type, AbstractMethodDeclaration methodDecl) {
this.handle(
IProblem.DuplicateModifierForMethod,
new String[] {new String(type.sourceName()), new String(methodDecl.selector)},
new String[] {new String(type.shortReadableName()), new String(methodDecl.selector)},
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void duplicateModifierForType(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.DuplicateModifierForType,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void duplicateModifierForVariable(LocalDeclaration localDecl, boolean complainForArgument) {
String[] arguments = new String[] {new String(localDecl.name)};
this.handle(
complainForArgument
? IProblem.DuplicateModifierForArgument
: IProblem.DuplicateModifierForVariable,
arguments,
arguments,
localDecl.sourceStart,
localDecl.sourceEnd);
}
public void duplicateNestedType(TypeDeclaration typeDecl) {
String[] arguments = new String[] {new String(typeDecl.name)};
this.handle(
IProblem.DuplicateNestedType,
arguments,
arguments,
typeDecl.sourceStart,
typeDecl.sourceEnd);
}
public void duplicateSuperinterface(SourceTypeBinding type, TypeDeclaration typeDecl, ReferenceBinding superType) {
this.handle(
IProblem.DuplicateSuperInterface,
new String[] {
new String(superType.readableName()),
new String(type.sourceName())},
new String[] {
new String(superType.shortReadableName()),
new String(type.sourceName())},
typeDecl.sourceStart,
typeDecl.sourceEnd);
}
public void duplicateTypeParameterInType(TypeParameter typeParameter) {
this.handle(
IProblem.DuplicateTypeVariable,
new String[] { new String(typeParameter.name)},
new String[] { new String(typeParameter.name)},
typeParameter.sourceStart,
typeParameter.sourceEnd);
}
public void duplicateTypes(CompilationUnitDeclaration compUnitDecl, TypeDeclaration typeDecl) {
String[] arguments = new String[] {new String(compUnitDecl.getFileName()), new String(typeDecl.name)};
this.referenceContext = typeDecl; // report the problem against the type not the entire compilation unit
this.handle(
IProblem.DuplicateTypes,
arguments,
arguments,
typeDecl.sourceStart,
typeDecl.sourceEnd,
compUnitDecl.compilationResult);
}
public void emptyControlFlowStatement(int sourceStart, int sourceEnd) {
this.handle(
IProblem.EmptyControlFlowStatement,
NoArgument,
NoArgument,
sourceStart,
sourceEnd);
}
public void errorNoMethodFor(MessageSend messageSend, TypeBinding recType, TypeBinding[] params) {
StringBuffer buffer = new StringBuffer();
StringBuffer shortBuffer = new StringBuffer();
for (int i = 0, length = params.length; i < length; i++) {
if (i != 0){
buffer.append(", "); //$NON-NLS-1$
shortBuffer.append(", "); //$NON-NLS-1$
}
buffer.append(new String(params[i].readableName()));
shortBuffer.append(new String(params[i].shortReadableName()));
}
int id = recType.isArrayType() ? IProblem.NoMessageSendOnArrayType : IProblem.NoMessageSendOnBaseType;
/*
if ((messageSend.bits & ASTNode.InsideJavadoc) != 0) {
id |= IProblem.Javadoc;
if (!reportInvalidJavadocTagsVisibility()) return;
}
*/
this.handle(
id,
new String[] {new String(recType.readableName()), new String(messageSend.selector), buffer.toString()},
new String[] {new String(recType.shortReadableName()), new String(messageSend.selector), shortBuffer.toString()},
messageSend.sourceStart,
messageSend.sourceEnd);
}
public void errorThisSuperInStatic(ASTNode reference) {
String[] arguments = new String[] {reference.isSuper() ? "super" : "this"}; //$NON-NLS-2$ //$NON-NLS-1$
this.handle(
IProblem.ThisInStaticContext,
arguments,
arguments,
reference.sourceStart,
reference.sourceEnd);
}
public void expressionShouldBeAVariable(Expression expression) {
this.handle(
IProblem.ExpressionShouldBeAVariable,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void fieldHiding(FieldDeclaration fieldDecl, Binding hiddenVariable) {
FieldBinding field = fieldDecl.binding;
if (CharOperation.equals(TypeConstants.SERIALVERSIONUID, field.name)
&& field.isStatic()
&& field.isFinal()
&& BaseTypes.LongBinding == field.type) {
return; // do not report unused serialVersionUID field
}
if (CharOperation.equals(TypeConstants.SERIALPERSISTENTFIELDS, field.name)
&& field.isStatic()
&& field.isFinal()
&& field.type.dimensions() == 1
&& CharOperation.equals(TypeConstants.CharArray_JAVA_IO_OBJECTSTREAMFIELD, field.type.leafComponentType().readableName())) {
return; // do not report unused serialPersistentFields field
}
if (hiddenVariable instanceof LocalVariableBinding) {
this.handle(
IProblem.FieldHidingLocalVariable,
new String[] {new String(field.declaringClass.readableName()), new String(field.name) },
new String[] {new String(field.declaringClass.shortReadableName()), new String(field.name) },
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
} else if (hiddenVariable instanceof FieldBinding) {
FieldBinding hiddenField = (FieldBinding) hiddenVariable;
this.handle(
IProblem.FieldHidingField,
new String[] {new String(field.declaringClass.readableName()), new String(field.name) , new String(hiddenField.declaringClass.readableName()) },
new String[] {new String(field.declaringClass.shortReadableName()), new String(field.name) , new String(hiddenField.declaringClass.shortReadableName()) },
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
}
private int fieldLocation(FieldBinding field, ASTNode node) {
if (node instanceof QualifiedNameReference) {
QualifiedNameReference ref = (QualifiedNameReference) node;
FieldBinding[] bindings = ref.otherBindings;
if (bindings != null)
for (int i = bindings.length; --i >= 0;)
if (bindings[i] == field)
return (int) ref.sourcePositions[i + 1]; // first position is for the primary field
}
return node.sourceEnd;
}
public void fieldsOrThisBeforeConstructorInvocation(ThisReference reference) {
this.handle(
IProblem.ThisSuperDuringConstructorInvocation,
NoArgument,
NoArgument,
reference.sourceStart,
reference.sourceEnd);
}
public void finallyMustCompleteNormally(Block finallyBlock) {
this.handle(
IProblem.FinallyMustCompleteNormally,
NoArgument,
NoArgument,
finallyBlock.sourceStart,
finallyBlock.sourceEnd);
}
public void finalMethodCannotBeOverridden(MethodBinding currentMethod, MethodBinding inheritedMethod) {
this.handle(
// Cannot override the final method from %1
// 8.4.3.3 - Final methods cannot be overridden or hidden.
IProblem.FinalMethodCannotBeOverridden,
new String[] {new String(inheritedMethod.declaringClass.readableName())},
new String[] {new String(inheritedMethod.declaringClass.shortReadableName())},
currentMethod.sourceStart(),
currentMethod.sourceEnd());
}
public void finalVariableBound(TypeVariableBinding typeVariable, TypeReference typeRef) {
this.handle(
IProblem.FinalBoundForTypeVariable,
new String[] { new String(typeVariable.sourceName), new String(typeRef.resolvedType.readableName())},
new String[] { new String(typeVariable.sourceName), new String(typeRef.resolvedType.shortReadableName())},
typeRef.sourceStart,
typeRef.sourceEnd);
}
public void forbiddenReference(TypeBinding type, ASTNode location, String visibilityRuleOwner) {
if (location == null) return;
this.handle(
IProblem.ForbiddenReference,
new String[] {new String(type.readableName()), visibilityRuleOwner},
new String[] {new String(type.shortReadableName()), visibilityRuleOwner},
location.sourceStart,
location.sourceEnd);
}
public void forwardReference(Reference reference, int indexInQualification, TypeBinding type) {
this.handle(
IProblem.ReferenceToForwardField,
NoArgument,
NoArgument,
reference.sourceStart,
reference.sourceEnd);
}
public void forwardTypeVariableReference(ASTNode location, TypeVariableBinding type) {
this.handle(
IProblem.ReferenceToForwardTypeVariable,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void genericTypeCannotExtendThrowable(TypeDeclaration typeDecl) {
this.handle(
IProblem.GenericTypeCannotExtendThrowable,
new String[]{ new String(typeDecl.binding.readableName()) },
new String[]{ new String(typeDecl.binding.shortReadableName()) },
typeDecl.superclass.sourceStart,
typeDecl.superclass.sourceEnd);
}
// use this private API when the compilation unit result can be found through the
// reference context. Otherwise, use the other API taking a problem and a compilation result
// as arguments
private void handle(
int problemId,
String[] problemArguments,
String[] messageArguments,
int problemStartPosition,
int problemEndPosition){
this.handle(
problemId,
problemArguments,
messageArguments,
problemStartPosition,
problemEndPosition,
this.referenceContext,
this.referenceContext == null ? null : this.referenceContext.compilationResult());
this.referenceContext = null;
}
// use this private API when the compilation unit result cannot be found through the
// reference context.
private void handle(
int problemId,
String[] problemArguments,
String[] messageArguments,
int problemStartPosition,
int problemEndPosition,
CompilationResult unitResult){
this.handle(
problemId,
problemArguments,
messageArguments,
problemStartPosition,
problemEndPosition,
this.referenceContext,
unitResult);
this.referenceContext = null;
}
// use this private API when the compilation unit result can be found through the
// reference context. Otherwise, use the other API taking a problem and a compilation result
// as arguments
private void handle(
int problemId,
String[] problemArguments,
String[] messageArguments,
int severity,
int problemStartPosition,
int problemEndPosition){
this.handle(
problemId,
problemArguments,
messageArguments,
severity,
problemStartPosition,
problemEndPosition,
this.referenceContext,
this.referenceContext == null ? null : this.referenceContext.compilationResult());
this.referenceContext = null;
}
public void hiddenCatchBlock(ReferenceBinding exceptionType, ASTNode location) {
this.handle(
IProblem.MaskedCatch,
new String[] {
new String(exceptionType.readableName()),
},
new String[] {
new String(exceptionType.shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
}
public void hidingEnclosingType(TypeDeclaration typeDecl) {
String[] arguments = new String[] {new String(typeDecl.name)};
this.handle(
IProblem.HidingEnclosingType,
arguments,
arguments,
typeDecl.sourceStart,
typeDecl.sourceEnd);
}
public void hierarchyCircularity(SourceTypeBinding sourceType, ReferenceBinding superType, TypeReference reference) {
int start = 0;
int end = 0;
String typeName = new String(superType.readableName());
String shortTypeName = new String(superType.sourceName());
if (reference == null) { // can only happen when java.lang.Object is busted
start = sourceType.sourceStart();
end = sourceType.sourceEnd();
} else {
start = reference.sourceStart;
end = reference.sourceEnd;
if (sourceType != superType) {
char[][] qName = reference.getTypeName();
typeName = CharOperation.toString(qName);
shortTypeName = new String(qName[qName.length-1]);
}
}
if (sourceType == superType)
this.handle(
IProblem.HierarchyCircularitySelfReference,
new String[] {typeName},
new String[] {shortTypeName},
start,
end);
else
this.handle(
IProblem.HierarchyCircularity,
new String[] {new String(sourceType.sourceName()), typeName},
new String[] {new String(sourceType.sourceName()), shortTypeName},
start,
end);
}
public void hierarchyHasProblems(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.HierarchyHasProblems,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalAbstractModifierCombinationForMethod(ReferenceBinding type, AbstractMethodDeclaration methodDecl) {
String[] arguments = new String[] {new String(type.sourceName()), new String(methodDecl.selector)};
this.handle(
IProblem.IllegalAbstractModifierCombinationForMethod,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void illegalClassLiteralForTypeVariable(TypeVariableBinding variable, ASTNode location) {
String[] arguments = new String[] { new String(variable.sourceName) };
this.handle(
IProblem.IllegalClassLiteralForTypeVariable,
arguments,
arguments,
location.sourceStart,
location.sourceEnd);
}
public void illegalExtendedDimensions(AnnotationTypeMemberDeclaration annotationTypeMemberDeclaration) {
this.handle(
IProblem.IllegalExtendedDimensions,
NoArgument,
NoArgument,
annotationTypeMemberDeclaration.sourceStart,
annotationTypeMemberDeclaration.sourceEnd);
}
public void illegalGenericArray(TypeBinding leadtComponentType, ASTNode location) {
this.handle(
IProblem.IllegalGenericArray,
new String[]{ new String(leadtComponentType.readableName())},
new String[]{ new String(leadtComponentType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void illegalInstanceOfGenericType(TypeBinding checkedType, ASTNode location) {
if (checkedType.isTypeVariable()) {
this.handle(
IProblem.IllegalInstanceofTypeParameter,
new String[] { new String(checkedType.readableName()), new String(checkedType.erasure().readableName())},
new String[] { new String(checkedType.shortReadableName()), new String(checkedType.erasure().shortReadableName())},
location.sourceStart,
location.sourceEnd);
return;
}
this.handle(
IProblem.IllegalInstanceofParameterizedType,
new String[] { new String(checkedType.readableName()), new String(checkedType.erasure().sourceName())},
new String[] { new String(checkedType.shortReadableName()), new String(checkedType.erasure().sourceName())},
location.sourceStart,
location.sourceEnd);
}
public void illegalModifierCombinationFinalAbstractForClass(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalModifierCombinationFinalAbstractForClass,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalModifierCombinationFinalVolatileForField(ReferenceBinding type, FieldDeclaration fieldDecl) {
String[] arguments = new String[] {new String(fieldDecl.name)};
this.handle(
IProblem.IllegalModifierCombinationFinalVolatileForField,
arguments,
arguments,
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void illegalModifierForClass(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalModifierForClass,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalModifierForField(ReferenceBinding type, FieldDeclaration fieldDecl) {
String[] arguments = new String[] {new String(fieldDecl.name)};
this.handle(
IProblem.IllegalModifierForField,
arguments,
arguments,
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void illegalModifierForInterface(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalModifierForInterface,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalModifierForInterfaceField(ReferenceBinding type, FieldDeclaration fieldDecl) {
String[] arguments = new String[] {new String(fieldDecl.name)};
this.handle(
IProblem.IllegalModifierForInterfaceField,
arguments,
arguments,
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void illegalModifierForInterfaceMethod(ReferenceBinding type, AbstractMethodDeclaration methodDecl) {
String[] arguments = new String[] {new String(type.sourceName()), new String(methodDecl.selector)};
this.handle(
IProblem.IllegalModifierForInterfaceMethod,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void illegalModifierForLocalClass(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalModifierForLocalClass,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalModifierForMemberClass(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalModifierForMemberClass,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalModifierForMemberInterface(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalModifierForMemberInterface,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalModifierForMethod(ReferenceBinding type, AbstractMethodDeclaration methodDecl) {
String[] arguments = new String[] {new String(type.sourceName()), new String(methodDecl.selector)};
this.handle(
IProblem.IllegalModifierForMethod,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void illegalModifierForVariable(LocalDeclaration localDecl, boolean complainAsArgument) {
String[] arguments = new String[] {new String(localDecl.name)};
this.handle(
complainAsArgument
? IProblem.IllegalModifierForArgument
: IProblem.IllegalModifierForVariable,
arguments,
arguments,
localDecl.sourceStart,
localDecl.sourceEnd);
}
public void illegalPrimitiveOrArrayTypeForEnclosingInstance(TypeBinding enclosingType, ASTNode location) {
this.handle(
IProblem.IllegalPrimitiveOrArrayTypeForEnclosingInstance,
new String[] {new String(enclosingType.readableName())},
new String[] {new String(enclosingType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void illegalStaticModifierForMemberType(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalStaticModifierForMemberType,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalUsageOfQualifiedTypeReference(QualifiedTypeReference qualifiedTypeReference) {
StringBuffer buffer = new StringBuffer();
char[][] tokens = qualifiedTypeReference.tokens;
for (int i = 0; i < tokens.length; i++) {
if (i > 0) buffer.append('.');
buffer.append(tokens[i]);
}
String[] arguments = new String[] { String.valueOf(buffer)};
this.handle(
IProblem.IllegalUsageOfQualifiedTypeReference,
arguments,
arguments,
qualifiedTypeReference.sourceStart,
qualifiedTypeReference.sourceEnd);
}
public void illegalVisibilityModifierCombinationForField(ReferenceBinding type, FieldDeclaration fieldDecl) {
String[] arguments = new String[] {new String(fieldDecl.name)};
this.handle(
IProblem.IllegalVisibilityModifierCombinationForField,
arguments,
arguments,
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void illegalVisibilityModifierCombinationForMemberType(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalVisibilityModifierCombinationForMemberType,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalVisibilityModifierCombinationForMethod(ReferenceBinding type, AbstractMethodDeclaration methodDecl) {
String[] arguments = new String[] {new String(type.sourceName()), new String(methodDecl.selector)};
this.handle(
IProblem.IllegalVisibilityModifierCombinationForMethod,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void illegalVisibilityModifierForInterfaceMemberType(SourceTypeBinding type) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.IllegalVisibilityModifierForInterfaceMemberType,
arguments,
arguments,
type.sourceStart(),
type.sourceEnd());
}
public void illegalVoidExpression(ASTNode location) {
this.handle(
IProblem.InvalidVoidExpression,
NoArgument,
NoArgument,
location.sourceStart,
location.sourceEnd);
}
public void importProblem(ImportReference importRef, Binding expectedImport) {
if (expectedImport.problemId() == NotFound) {
char[][] tokens = expectedImport instanceof ProblemReferenceBinding
? ((ProblemReferenceBinding) expectedImport).compoundName
: importRef.tokens;
String[] arguments = new String[]{CharOperation.toString(tokens)};
this.handle(
IProblem.ImportNotFound,
arguments,
arguments,
importRef.sourceStart,
(int) importRef.sourcePositions[tokens.length - 1]);
return;
}
invalidType(importRef, (TypeBinding)expectedImport);
}
public void incompatibleExceptionInThrowsClause(SourceTypeBinding type, MethodBinding currentMethod, MethodBinding inheritedMethod, ReferenceBinding exceptionType) {
if (type == currentMethod.declaringClass) {
int id;
if (currentMethod.declaringClass.isInterface()
&& !inheritedMethod.isPublic()){ // interface inheriting Object protected method
id = IProblem.IncompatibleExceptionInThrowsClauseForNonInheritedInterfaceMethod;
} else {
id = IProblem.IncompatibleExceptionInThrowsClause;
}
this.handle(
// Exception %1 is not compatible with throws clause in %2
// 9.4.4 - The type of exception in the throws clause is incompatible.
id,
new String[] {
new String(exceptionType.sourceName()),
new String(
CharOperation.concat(
inheritedMethod.declaringClass.readableName(),
inheritedMethod.readableName(),
'.'))},
new String[] {
new String(exceptionType.sourceName()),
new String(
CharOperation.concat(
inheritedMethod.declaringClass.shortReadableName(),
inheritedMethod.shortReadableName(),
'.'))},
currentMethod.sourceStart(),
currentMethod.sourceEnd());
} else
this.handle(
// Exception %1 in throws clause of %2 is not compatible with %3
// 9.4.4 - The type of exception in the throws clause is incompatible.
IProblem.IncompatibleExceptionInInheritedMethodThrowsClause,
new String[] {
new String(exceptionType.sourceName()),
new String(
CharOperation.concat(
currentMethod.declaringClass.sourceName(),
currentMethod.readableName(),
'.')),
new String(
CharOperation.concat(
inheritedMethod.declaringClass.readableName(),
inheritedMethod.readableName(),
'.'))},
new String[] {
new String(exceptionType.sourceName()),
new String(
CharOperation.concat(
currentMethod.declaringClass.sourceName(),
currentMethod.shortReadableName(),
'.')),
new String(
CharOperation.concat(
inheritedMethod.declaringClass.shortReadableName(),
inheritedMethod.shortReadableName(),
'.'))},
type.sourceStart(),
type.sourceEnd());
}
public void incompatibleReturnType(MethodBinding currentMethod, MethodBinding inheritedMethod) {
StringBuffer methodSignature = new StringBuffer();
methodSignature
.append(inheritedMethod.declaringClass.readableName())
.append('.')
.append(inheritedMethod.readableName());
StringBuffer shortSignature = new StringBuffer();
shortSignature
.append(inheritedMethod.declaringClass.shortReadableName())
.append('.')
.append(inheritedMethod.shortReadableName());
int id;
if (currentMethod.declaringClass.isInterface()
&& !inheritedMethod.isPublic()){ // interface inheriting Object protected method
id = IProblem.IncompatibleReturnTypeForNonInheritedInterfaceMethod;
} else {
id = IProblem.IncompatibleReturnType;
}
this.handle(
id,
new String[] {methodSignature.toString()},
new String[] {shortSignature.toString()},
currentMethod.sourceStart(),
currentMethod.sourceEnd());
}
public void incorrectArityForParameterizedType(ASTNode location, TypeBinding type, TypeBinding[] argumentTypes) {
if (location == null) {
this.handle(
IProblem.IncorrectArityForParameterizedType,
new String[] {new String(type.readableName()), parametersAsString(argumentTypes, false)},
new String[] {new String(type.shortReadableName()), parametersAsString(argumentTypes, true)},
AbortCompilation | Error,
0,
1);
}
this.handle(
IProblem.IncorrectArityForParameterizedType,
new String[] {new String(type.readableName()), parametersAsString(argumentTypes, false)},
new String[] {new String(type.shortReadableName()), parametersAsString(argumentTypes, true)},
location.sourceStart,
location.sourceEnd);
}
public void incorrectLocationForEmptyDimension(ArrayAllocationExpression expression, int index) {
this.handle(
IProblem.IllegalDimension,
NoArgument,
NoArgument,
expression.dimensions[index + 1].sourceStart,
expression.dimensions[index + 1].sourceEnd);
}
public void incorrectSwitchType(Expression expression, TypeBinding testType) {
this.handle(
IProblem.IncorrectSwitchType,
new String[] {new String(testType.readableName())},
new String[] {new String(testType.shortReadableName())},
expression.sourceStart,
expression.sourceEnd);
}
public void indirectAccessToStaticField(ASTNode location, FieldBinding field){
this.handle(
IProblem.IndirectAccessToStaticField,
new String[] {new String(field.declaringClass.readableName()), new String(field.name)},
new String[] {new String(field.declaringClass.shortReadableName()), new String(field.name)},
location.sourceStart,
fieldLocation(field, location));
}
public void indirectAccessToStaticMethod(ASTNode location, MethodBinding method) {
this.handle(
IProblem.IndirectAccessToStaticMethod,
new String[] {new String(method.declaringClass.readableName()), new String(method.selector), parametersAsString(method.parameters, false)},
new String[] {new String(method.declaringClass.shortReadableName()), new String(method.selector), parametersAsString(method.parameters, true)},
location.sourceStart,
location.sourceEnd);
}
public void indirectAccessToStaticType(ASTNode location, ReferenceBinding type) {
this.handle(
IProblem.IndirectAccessToStaticMethod,
new String[] {new String(type.enclosingType().readableName()), new String(type.sourceName) },
new String[] {new String(type.enclosingType().shortReadableName()), new String(type.sourceName) },
location.sourceStart,
location.sourceEnd);
}
public void inheritedMethodReducesVisibility(SourceTypeBinding type, MethodBinding concreteMethod, MethodBinding[] abstractMethods) {
StringBuffer concreteSignature = new StringBuffer();
concreteSignature
.append(concreteMethod.declaringClass.readableName())
.append('.')
.append(concreteMethod.readableName());
StringBuffer shortSignature = new StringBuffer();
shortSignature
.append(concreteMethod.declaringClass.shortReadableName())
.append('.')
.append(concreteMethod.shortReadableName());
this.handle(
// The inherited method %1 cannot hide the public abstract method in %2
IProblem.InheritedMethodReducesVisibility,
new String[] {
concreteSignature.toString(),
new String(abstractMethods[0].declaringClass.readableName())},
new String[] {
new String(shortSignature.toString()),
new String(abstractMethods[0].declaringClass.shortReadableName())},
type.sourceStart(),
type.sourceEnd());
}
public void inheritedMethodsHaveIncompatibleReturnTypes(SourceTypeBinding type, MethodBinding[] inheritedMethods, int length) {
StringBuffer methodSignatures = new StringBuffer();
StringBuffer shortSignatures = new StringBuffer();
for (int i = length; --i >= 0;) {
methodSignatures
.append(inheritedMethods[i].declaringClass.readableName())
.append('.')
.append(inheritedMethods[i].readableName());
shortSignatures
.append(inheritedMethods[i].declaringClass.shortReadableName())
.append('.')
.append(inheritedMethods[i].shortReadableName());
if (i != 0){
methodSignatures.append(", "); //$NON-NLS-1$
shortSignatures.append(", "); //$NON-NLS-1$
}
}
this.handle(
// Return type is incompatible with %1
// 9.4.2 - The return type from the method is incompatible with the declaration.
IProblem.IncompatibleReturnType,
new String[] {methodSignatures.toString()},
new String[] {shortSignatures.toString()},
type.sourceStart(),
type.sourceEnd());
}
public void initializerMustCompleteNormally(FieldDeclaration fieldDecl) {
this.handle(
IProblem.InitializerMustCompleteNormally,
NoArgument,
NoArgument,
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void innerTypesCannotDeclareStaticInitializers(ReferenceBinding innerType, ASTNode location) {
this.handle(
IProblem.CannotDefineStaticInitializerInLocalType,
new String[] {new String(innerType.readableName())},
new String[] {new String(innerType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void interfaceCannotHaveConstructors(ConstructorDeclaration constructor) {
this.handle(
IProblem.InterfaceCannotHaveConstructors,
NoArgument,
NoArgument,
constructor.sourceStart,
constructor.sourceEnd,
constructor,
constructor.compilationResult());
}
public void interfaceCannotHaveInitializers(SourceTypeBinding type, FieldDeclaration fieldDecl) {
String[] arguments = new String[] {new String(type.sourceName())};
this.handle(
IProblem.InterfaceCannotHaveInitializers,
arguments,
arguments,
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void invalidBreak(ASTNode location) {
this.handle(
IProblem.InvalidBreak,
NoArgument,
NoArgument,
location.sourceStart,
location.sourceEnd);
}
public void invalidConstructor(Statement statement, MethodBinding targetConstructor) {
boolean insideDefaultConstructor =
(this.referenceContext instanceof ConstructorDeclaration)
&& ((ConstructorDeclaration)this.referenceContext).isDefaultConstructor();
boolean insideImplicitConstructorCall =
(statement instanceof ExplicitConstructorCall)
&& (((ExplicitConstructorCall) statement).accessMode == ExplicitConstructorCall.ImplicitSuper);
int id = IProblem.UndefinedConstructor; //default...
MethodBinding shownConstructor = targetConstructor;
switch (targetConstructor.problemId()) {
case NotFound :
if (insideDefaultConstructor){
id = IProblem.UndefinedConstructorInDefaultConstructor;
} else if (insideImplicitConstructorCall){
id = IProblem.UndefinedConstructorInImplicitConstructorCall;
} else {
id = IProblem.UndefinedConstructor;
}
break;
case NotVisible :
if (insideDefaultConstructor){
id = IProblem.NotVisibleConstructorInDefaultConstructor;
} else if (insideImplicitConstructorCall){
id = IProblem.NotVisibleConstructorInImplicitConstructorCall;
} else {
id = IProblem.NotVisibleConstructor;
}
ProblemMethodBinding problemConstructor = (ProblemMethodBinding) targetConstructor;
if (problemConstructor.closestMatch != null) {
shownConstructor = problemConstructor.closestMatch.original();
}
break;
case Ambiguous :
if (insideDefaultConstructor){
id = IProblem.AmbiguousConstructorInDefaultConstructor;
} else if (insideImplicitConstructorCall){
id = IProblem.AmbiguousConstructorInImplicitConstructorCall;
} else {
id = IProblem.AmbiguousConstructor;
}
break;
case ParameterBoundMismatch :
problemConstructor = (ProblemMethodBinding) targetConstructor;
ParameterizedGenericMethodBinding substitutedConstructor = (ParameterizedGenericMethodBinding) problemConstructor.closestMatch;
shownConstructor = substitutedConstructor.original();
TypeBinding typeArgument = targetConstructor.parameters[0];
TypeVariableBinding typeParameter = (TypeVariableBinding) targetConstructor.parameters[1];
this.handle(
IProblem.GenericConstructorTypeArgumentMismatch,
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, false),
new String(shownConstructor.declaringClass.readableName()),
parametersAsString(substitutedConstructor.parameters, false),
new String(typeArgument.readableName()),
new String(typeParameter.sourceName),
parameterBoundAsString(typeParameter, false) },
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, true),
new String(shownConstructor.declaringClass.shortReadableName()),
parametersAsString(substitutedConstructor.parameters, true),
new String(typeArgument.shortReadableName()),
new String(typeParameter.sourceName),
parameterBoundAsString(typeParameter, true) },
statement.sourceStart,
statement.sourceEnd);
return;
case TypeParameterArityMismatch :
problemConstructor = (ProblemMethodBinding) targetConstructor;
shownConstructor = problemConstructor.closestMatch;
if (shownConstructor.typeVariables == TypeConstants.NoTypeVariables) {
this.handle(
IProblem.NonGenericConstructor,
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, false),
new String(shownConstructor.declaringClass.readableName()),
parametersAsString(targetConstructor.parameters, false) },
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, true),
new String(shownConstructor.declaringClass.shortReadableName()),
parametersAsString(targetConstructor.parameters, true) },
statement.sourceStart,
statement.sourceEnd);
} else {
this.handle(
IProblem.IncorrectArityForParameterizedConstructor ,
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, false),
new String(shownConstructor.declaringClass.readableName()),
parametersAsString(shownConstructor.typeVariables, false),
parametersAsString(targetConstructor.parameters, false) },
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, true),
new String(shownConstructor.declaringClass.shortReadableName()),
parametersAsString(shownConstructor.typeVariables, true),
parametersAsString(targetConstructor.parameters, true) },
statement.sourceStart,
statement.sourceEnd);
}
return;
case ParameterizedMethodTypeMismatch :
problemConstructor = (ProblemMethodBinding) targetConstructor;
shownConstructor = problemConstructor.closestMatch;
this.handle(
IProblem.ParameterizedConstructorArgumentTypeMismatch,
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, false),
new String(shownConstructor.declaringClass.readableName()),
parametersAsString(((ParameterizedGenericMethodBinding)shownConstructor).typeArguments, false),
parametersAsString(targetConstructor.parameters, false) },
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, true),
new String(shownConstructor.declaringClass.shortReadableName()),
parametersAsString(((ParameterizedGenericMethodBinding)shownConstructor).typeArguments, true),
parametersAsString(targetConstructor.parameters, true) },
statement.sourceStart,
statement.sourceEnd);
return;
case TypeArgumentsForRawGenericMethod :
problemConstructor = (ProblemMethodBinding) targetConstructor;
shownConstructor = problemConstructor.closestMatch;
this.handle(
IProblem.TypeArgumentsForRawGenericConstructor,
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, false),
new String(shownConstructor.declaringClass.readableName()),
parametersAsString(targetConstructor.parameters, false) },
new String[] {
new String(shownConstructor.declaringClass.sourceName()),
parametersAsString(shownConstructor.parameters, true),
new String(shownConstructor.declaringClass.shortReadableName()),
parametersAsString(targetConstructor.parameters, true) },
statement.sourceStart,
statement.sourceEnd);
return;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
this.handle(
id,
new String[] {new String(targetConstructor.declaringClass.readableName()), parametersAsString(shownConstructor.parameters, false)},
new String[] {new String(targetConstructor.declaringClass.shortReadableName()), parametersAsString(shownConstructor.parameters, true)},
statement.sourceStart,
statement.sourceEnd);
}
public void invalidContinue(ASTNode location) {
this.handle(
IProblem.InvalidContinue,
NoArgument,
NoArgument,
location.sourceStart,
location.sourceEnd);
}
public void invalidEnclosingType(Expression expression, TypeBinding type, ReferenceBinding enclosingType) {
if (enclosingType.isAnonymousType()) enclosingType = enclosingType.superclass();
int flag = IProblem.UndefinedType; // default
switch (type.problemId()) {
case NotFound : // 1
flag = IProblem.UndefinedType;
break;
case NotVisible : // 2
flag = IProblem.NotVisibleType;
break;
case Ambiguous : // 3
flag = IProblem.AmbiguousType;
break;
case InternalNameProvided :
flag = IProblem.InternalTypeNameProvided;
break;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
this.handle(
flag,
new String[] {new String(enclosingType.readableName()) + "." + new String(type.readableName())}, //$NON-NLS-1$
new String[] {new String(enclosingType.shortReadableName()) + "." + new String(type.shortReadableName())}, //$NON-NLS-1$
expression.sourceStart,
expression.sourceEnd);
}
public void invalidExplicitConstructorCall(ASTNode location) {
this.handle(
IProblem.InvalidExplicitConstructorCall,
NoArgument,
NoArgument,
location.sourceStart,
location.sourceEnd);
}
public void invalidExpressionAsStatement(Expression expression){
this.handle(
IProblem.InvalidExpressionAsStatement,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void invalidField(FieldReference fieldRef, TypeBinding searchedType) {
int id = IProblem.UndefinedField;
FieldBinding field = fieldRef.binding;
switch (field.problemId()) {
case NotFound :
id = IProblem.UndefinedField;
/* also need to check that the searchedType is the receiver type
if (searchedType.isHierarchyInconsistent())
severity = SecondaryError;
*/
break;
case NotVisible :
id = IProblem.NotVisibleField;
break;
case Ambiguous :
id = IProblem.AmbiguousField;
break;
case NonStaticReferenceInStaticContext :
id = IProblem.NonStaticFieldFromStaticInvocation;
break;
case NonStaticReferenceInConstructorInvocation :
id = IProblem.InstanceFieldDuringConstructorInvocation;
break;
case InheritedNameHidesEnclosingName :
id = IProblem.InheritedFieldHidesEnclosingName;
break;
case ReceiverTypeNotVisible :
this.handle(
IProblem.NotVisibleType, // cannot occur in javadoc comments
new String[] {new String(searchedType.leafComponentType().readableName())},
new String[] {new String(searchedType.leafComponentType().shortReadableName())},
fieldRef.receiver.sourceStart,
fieldRef.receiver.sourceEnd);
return;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
String[] arguments = new String[] {new String(field.readableName())};
this.handle(
id,
arguments,
arguments,
fieldRef.sourceStart,
fieldRef.sourceEnd);
}
public void invalidField(NameReference nameRef, FieldBinding field) {
int id = IProblem.UndefinedField;
switch (field.problemId()) {
case NotFound :
id = IProblem.UndefinedField;
break;
case NotVisible :
id = IProblem.NotVisibleField;
break;
case Ambiguous :
id = IProblem.AmbiguousField;
break;
case NonStaticReferenceInStaticContext :
id = IProblem.NonStaticFieldFromStaticInvocation;
break;
case NonStaticReferenceInConstructorInvocation :
id = IProblem.InstanceFieldDuringConstructorInvocation;
break;
case InheritedNameHidesEnclosingName :
id = IProblem.InheritedFieldHidesEnclosingName;
break;
case ReceiverTypeNotVisible :
this.handle(
IProblem.NotVisibleType,
new String[] {new String(field.declaringClass.leafComponentType().readableName())},
new String[] {new String(field.declaringClass.leafComponentType().shortReadableName())},
nameRef.sourceStart,
nameRef.sourceEnd);
return;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
String[] arguments = new String[] {new String(field.readableName())};
this.handle(
id,
arguments,
arguments,
nameRef.sourceStart,
nameRef.sourceEnd);
}
public void invalidField(QualifiedNameReference nameRef, FieldBinding field, int index, TypeBinding searchedType) {
//the resolution of the index-th field of qname failed
//qname.otherBindings[index] is the binding that has produced the error
//The different targetted errors should be :
//UndefinedField
//NotVisibleField
//AmbiguousField
if (searchedType.isBaseType()) {
this.handle(
IProblem.NoFieldOnBaseType,
new String[] {
new String(searchedType.readableName()),
CharOperation.toString(CharOperation.subarray(nameRef.tokens, 0, index)),
new String(nameRef.tokens[index])},
new String[] {
new String(searchedType.sourceName()),
CharOperation.toString(CharOperation.subarray(nameRef.tokens, 0, index)),
new String(nameRef.tokens[index])},
nameRef.sourceStart,
(int) nameRef.sourcePositions[index]);
return;
}
int id = IProblem.UndefinedField;
switch (field.problemId()) {
case NotFound :
id = IProblem.UndefinedField;
/* also need to check that the searchedType is the receiver type
if (searchedType.isHierarchyInconsistent())
severity = SecondaryError;
*/
break;
case NotVisible :
id = IProblem.NotVisibleField;
break;
case Ambiguous :
id = IProblem.AmbiguousField;
break;
case NonStaticReferenceInStaticContext :
id = IProblem.NonStaticFieldFromStaticInvocation;
break;
case NonStaticReferenceInConstructorInvocation :
id = IProblem.InstanceFieldDuringConstructorInvocation;
break;
case InheritedNameHidesEnclosingName :
id = IProblem.InheritedFieldHidesEnclosingName;
break;
case ReceiverTypeNotVisible :
this.handle(
IProblem.NotVisibleType,
new String[] {new String(searchedType.leafComponentType().readableName())},
new String[] {new String(searchedType.leafComponentType().shortReadableName())},
nameRef.sourceStart,
nameRef.sourceEnd);
return;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
String[] arguments = new String[] {CharOperation.toString(CharOperation.subarray(nameRef.tokens, 0, index + 1))};
this.handle(
id,
arguments,
arguments,
nameRef.sourceStart,
(int) nameRef.sourcePositions[index]);
}
public void invalidFileNameForPackageAnnotations(Annotation annotation) {
this.handle(
IProblem.InvalidFileNameForPackageAnnotations,
NoArgument,
NoArgument,
annotation.sourceStart,
annotation.sourceEnd);
}
public void invalidMethod(MessageSend messageSend, MethodBinding method) {
int id = IProblem.UndefinedMethod; //default...
MethodBinding shownMethod = method;
switch (method.problemId()) {
case NotFound :
id = IProblem.UndefinedMethod;
ProblemMethodBinding problemMethod = (ProblemMethodBinding) method;
if (problemMethod.closestMatch != null) {
shownMethod = problemMethod.closestMatch;
String closestParameterTypeNames = parametersAsString(shownMethod.parameters, false);
String parameterTypeNames = parametersAsString(method.parameters, false);
String closestParameterTypeShortNames = parametersAsString(shownMethod.parameters, true);
String parameterTypeShortNames = parametersAsString(method.parameters, true);
if (closestParameterTypeShortNames.equals(parameterTypeShortNames)){
closestParameterTypeShortNames = closestParameterTypeNames;
parameterTypeShortNames = parameterTypeNames;
}
this.handle(
IProblem.ParameterMismatch,
new String[] {
new String(shownMethod.declaringClass.readableName()),
new String(shownMethod.selector),
closestParameterTypeNames,
parameterTypeNames
},
new String[] {
new String(shownMethod.declaringClass.shortReadableName()),
new String(shownMethod.selector),
closestParameterTypeShortNames,
parameterTypeShortNames
},
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
return;
}
break;
case NotVisible :
id = IProblem.NotVisibleMethod;
problemMethod = (ProblemMethodBinding) method;
if (problemMethod.closestMatch != null) {
shownMethod = problemMethod.closestMatch.original();
}
break;
case Ambiguous :
id = IProblem.AmbiguousMethod;
break;
case InheritedNameHidesEnclosingName :
id = IProblem.InheritedMethodHidesEnclosingName;
break;
case NonStaticReferenceInConstructorInvocation :
id = IProblem.InstanceMethodDuringConstructorInvocation;
break;
case NonStaticReferenceInStaticContext :
id = IProblem.StaticMethodRequested;
break;
case ReceiverTypeNotVisible :
this.handle(
IProblem.NotVisibleType, // cannot occur in javadoc comments
new String[] {new String(method.declaringClass.leafComponentType().readableName())},
new String[] {new String(method.declaringClass.leafComponentType().shortReadableName())},
messageSend.receiver.sourceStart,
messageSend.receiver.sourceEnd);
return;
case ParameterBoundMismatch :
problemMethod = (ProblemMethodBinding) method;
ParameterizedGenericMethodBinding substitutedMethod = (ParameterizedGenericMethodBinding) problemMethod.closestMatch;
shownMethod = substitutedMethod.original();
TypeBinding typeArgument = method.parameters[0];
TypeVariableBinding typeParameter = (TypeVariableBinding) method.parameters[1];
this.handle(
IProblem.GenericMethodTypeArgumentMismatch,
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, false),
new String(shownMethod.declaringClass.readableName()),
parametersAsString(substitutedMethod.parameters, false),
new String(typeArgument.readableName()),
new String(typeParameter.sourceName),
parameterBoundAsString(typeParameter, false) },
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, true),
new String(shownMethod.declaringClass.shortReadableName()),
parametersAsString(substitutedMethod.parameters, true),
new String(typeArgument.shortReadableName()),
new String(typeParameter.sourceName),
parameterBoundAsString(typeParameter, true) },
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
return;
case TypeParameterArityMismatch :
problemMethod = (ProblemMethodBinding) method;
shownMethod = problemMethod.closestMatch;
if (shownMethod.typeVariables == TypeConstants.NoTypeVariables) {
this.handle(
IProblem.NonGenericMethod ,
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, false),
new String(shownMethod.declaringClass.readableName()),
parametersAsString(method.parameters, false) },
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, true),
new String(shownMethod.declaringClass.shortReadableName()),
parametersAsString(method.parameters, true) },
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
} else {
this.handle(
IProblem.IncorrectArityForParameterizedMethod ,
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, false),
new String(shownMethod.declaringClass.readableName()),
parametersAsString(shownMethod.typeVariables, false),
parametersAsString(method.parameters, false) },
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, true),
new String(shownMethod.declaringClass.shortReadableName()),
parametersAsString(shownMethod.typeVariables, true),
parametersAsString(method.parameters, true) },
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
}
return;
case ParameterizedMethodTypeMismatch :
problemMethod = (ProblemMethodBinding) method;
shownMethod = problemMethod.closestMatch;
this.handle(
IProblem.ParameterizedMethodArgumentTypeMismatch,
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, false),
new String(shownMethod.declaringClass.readableName()),
parametersAsString(((ParameterizedGenericMethodBinding)shownMethod).typeArguments, false),
parametersAsString(method.parameters, false) },
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, true),
new String(shownMethod.declaringClass.shortReadableName()),
parametersAsString(((ParameterizedGenericMethodBinding)shownMethod).typeArguments, true),
parametersAsString(method.parameters, true) },
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
return;
case TypeArgumentsForRawGenericMethod :
problemMethod = (ProblemMethodBinding) method;
shownMethod = problemMethod.closestMatch;
this.handle(
IProblem.TypeArgumentsForRawGenericMethod ,
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, false),
new String(shownMethod.declaringClass.readableName()),
parametersAsString(method.parameters, false) },
new String[] {
new String(shownMethod.selector),
parametersAsString(shownMethod.parameters, true),
new String(shownMethod.declaringClass.shortReadableName()),
parametersAsString(method.parameters, true) },
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
return;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
this.handle(
id,
new String[] {
new String(method.declaringClass.readableName()),
new String(shownMethod.selector), parametersAsString(shownMethod.parameters, false)},
new String[] {
new String(method.declaringClass.shortReadableName()),
new String(shownMethod.selector), parametersAsString(shownMethod.parameters, true)},
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
}
public void invalidNullToSynchronize(Expression expression) {
this.handle(
IProblem.InvalidNullToSynchronized,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void invalidOperator(BinaryExpression expression, TypeBinding leftType, TypeBinding rightType) {
String leftName = new String(leftType.readableName());
String rightName = new String(rightType.readableName());
String leftShortName = new String(leftType.shortReadableName());
String rightShortName = new String(rightType.shortReadableName());
if (leftShortName.equals(rightShortName)){
leftShortName = leftName;
rightShortName = rightName;
}
this.handle(
IProblem.InvalidOperator,
new String[] {
expression.operatorToString(),
leftName + ", " + rightName}, //$NON-NLS-1$
new String[] {
expression.operatorToString(),
leftShortName + ", " + rightShortName}, //$NON-NLS-1$
expression.sourceStart,
expression.sourceEnd);
}
public void invalidOperator(CompoundAssignment assign, TypeBinding leftType, TypeBinding rightType) {
String leftName = new String(leftType.readableName());
String rightName = new String(rightType.readableName());
String leftShortName = new String(leftType.shortReadableName());
String rightShortName = new String(rightType.shortReadableName());
if (leftShortName.equals(rightShortName)){
leftShortName = leftName;
rightShortName = rightName;
}
this.handle(
IProblem.InvalidOperator,
new String[] {
assign.operatorToString(),
leftName + ", " + rightName}, //$NON-NLS-1$
new String[] {
assign.operatorToString(),
leftShortName + ", " + rightShortName}, //$NON-NLS-1$
assign.sourceStart,
assign.sourceEnd);
}
public void invalidOperator(UnaryExpression expression, TypeBinding type) {
this.handle(
IProblem.InvalidOperator,
new String[] {expression.operatorToString(), new String(type.readableName())},
new String[] {expression.operatorToString(), new String(type.shortReadableName())},
expression.sourceStart,
expression.sourceEnd);
}
public void invalidParameterizedExceptionType(TypeBinding exceptionType, ASTNode location) {
this.handle(
IProblem.InvalidParameterizedExceptionType,
new String[] {new String(exceptionType.readableName())},
new String[] {new String(exceptionType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void invalidParenthesizedExpression(ASTNode reference) {
this.handle(
IProblem.InvalidParenthesizedExpression,
NoArgument,
NoArgument,
reference.sourceStart,
reference.sourceEnd);
}
public void invalidType(ASTNode location, TypeBinding type) {
int id = IProblem.UndefinedType; // default
switch (type.problemId()) {
case NotFound :
id = IProblem.UndefinedType;
break;
case NotVisible :
id = IProblem.NotVisibleType;
break;
case Ambiguous :
id = IProblem.AmbiguousType;
break;
case InternalNameProvided :
id = IProblem.InternalTypeNameProvided;
break;
case InheritedNameHidesEnclosingName :
id = IProblem.InheritedTypeHidesEnclosingName;
break;
case NonStaticReferenceInStaticContext :
id = IProblem.TypeVariableReferenceFromStaticContext;
break;
case IllegalSuperTypeVariable :
id = IProblem.IllegalTypeVariableSuperReference;
break;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
int end = location.sourceEnd;
if (location instanceof QualifiedNameReference) {
QualifiedNameReference ref = (QualifiedNameReference) location;
if (ref.indexOfFirstFieldBinding >= 1)
end = (int) ref.sourcePositions[ref.indexOfFirstFieldBinding - 1];
} else if (location instanceof QualifiedTypeReference) {
QualifiedTypeReference ref = (QualifiedTypeReference) location;
if (type instanceof ReferenceBinding) {
char[][] name = ((ReferenceBinding) type).compoundName;
end = (int) ref.sourcePositions[name.length - 1];
}
} else if (location instanceof ImportReference) {
ImportReference ref = (ImportReference) location;
if (type instanceof ReferenceBinding) {
char[][] name = ((ReferenceBinding) type).compoundName;
end = (int) ref.sourcePositions[name.length - 1];
}
}
this.handle(
id,
new String[] {new String(type.readableName()) },
new String[] {new String(type.shortReadableName())},
location.sourceStart,
end);
}
public void invalidTypeForCollection(Expression expression) {
this.handle(
IProblem.InvalidTypeForCollection,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void invalidTypeReference(Expression expression) {
this.handle(
IProblem.InvalidTypeExpression,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void invalidTypeToSynchronize(Expression expression, TypeBinding type) {
this.handle(
IProblem.InvalidTypeToSynchronized,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
expression.sourceStart,
expression.sourceEnd);
}
public void invalidTypeVariableAsException(TypeBinding exceptionType, ASTNode location) {
this.handle(
IProblem.InvalidTypeVariableExceptionType,
new String[] {new String(exceptionType.readableName())},
new String[] {new String(exceptionType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void invalidUnaryExpression(Expression expression) {
this.handle(
IProblem.InvalidUnaryExpression,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void invalidUsageOfAnnotation(Annotation annotation) {
this.handle(
IProblem.InvalidUsageOfAnnotations,
NoArgument,
NoArgument,
annotation.sourceStart,
annotation.sourceEnd);
}
public void invalidUsageOfAnnotationDeclarations(AnnotationTypeDeclaration annotationTypeDeclaration) {
this.handle(
IProblem.InvalidUsageOfAnnotationDeclarations,
NoArgument,
NoArgument,
annotationTypeDeclaration.sourceStart,
annotationTypeDeclaration.sourceEnd);
}
public void invalidUsageOfEnumDeclarations(EnumDeclaration enumDeclaration) {
this.handle(
IProblem.InvalidUsageOfEnumDeclarations,
NoArgument,
NoArgument,
enumDeclaration.sourceStart,
enumDeclaration.sourceEnd);
}
public void invalidUsageOfForeachStatements(LocalDeclaration elementVariable, Expression collection) {
this.handle(
IProblem.InvalidUsageOfForeachStatements,
NoArgument,
NoArgument,
elementVariable.declarationSourceStart,
collection.sourceEnd);
}
public void invalidUsageOfStaticImports(ImportReference staticImport) {
this.handle(
IProblem.InvalidUsageOfStaticImports,
NoArgument,
NoArgument,
staticImport.declarationSourceStart,
staticImport.declarationSourceEnd);
}
public void invalidUsageOfTypeArguments(TypeReference firstTypeReference, TypeReference lastTypeReference) {
this.handle(
IProblem.InvalidUsageOfTypeArguments,
NoArgument,
NoArgument,
firstTypeReference.sourceStart,
lastTypeReference.sourceEnd);
}
public void invalidUsageOfTypeParameters(TypeParameter firstTypeParameter, TypeParameter lastTypeParameter) {
this.handle(
IProblem.InvalidUsageOfTypeParameters,
NoArgument,
NoArgument,
firstTypeParameter.declarationSourceStart,
lastTypeParameter.declarationSourceEnd);
}
public void invalidUsageOfVarargs(Argument argument) {
this.handle(
IProblem.InvalidUsageOfVarargs,
NoArgument,
NoArgument,
argument.type.sourceStart,
argument.sourceEnd);
}
public void isClassPathCorrect(char[][] wellKnownTypeName, CompilationUnitDeclaration compUnitDecl) {
this.referenceContext = compUnitDecl;
String[] arguments = new String[] {CharOperation.toString(wellKnownTypeName)};
this.handle(
IProblem.IsClassPathCorrect,
arguments,
arguments,
AbortCompilation | Error,
0,
0);
}
private boolean isIdentifier(int token) {
return token == TerminalTokens.TokenNameIdentifier;
}
private boolean isKeyword(int token) {
switch(token) {
case TerminalTokens.TokenNameabstract:
case TerminalTokens.TokenNameassert:
case TerminalTokens.TokenNamebyte:
case TerminalTokens.TokenNamebreak:
case TerminalTokens.TokenNameboolean:
case TerminalTokens.TokenNamecase:
case TerminalTokens.TokenNamechar:
case TerminalTokens.TokenNamecatch:
case TerminalTokens.TokenNameclass:
case TerminalTokens.TokenNamecontinue:
case TerminalTokens.TokenNamedo:
case TerminalTokens.TokenNamedouble:
case TerminalTokens.TokenNamedefault:
case TerminalTokens.TokenNameelse:
case TerminalTokens.TokenNameextends:
case TerminalTokens.TokenNamefor:
case TerminalTokens.TokenNamefinal:
case TerminalTokens.TokenNamefloat:
case TerminalTokens.TokenNamefalse:
case TerminalTokens.TokenNamefinally:
case TerminalTokens.TokenNameif:
case TerminalTokens.TokenNameint:
case TerminalTokens.TokenNameimport:
case TerminalTokens.TokenNameinterface:
case TerminalTokens.TokenNameimplements:
case TerminalTokens.TokenNameinstanceof:
case TerminalTokens.TokenNamelong:
case TerminalTokens.TokenNamenew:
case TerminalTokens.TokenNamenull:
case TerminalTokens.TokenNamenative:
case TerminalTokens.TokenNamepublic:
case TerminalTokens.TokenNamepackage:
case TerminalTokens.TokenNameprivate:
case TerminalTokens.TokenNameprotected:
case TerminalTokens.TokenNamereturn:
case TerminalTokens.TokenNameshort:
case TerminalTokens.TokenNamesuper:
case TerminalTokens.TokenNamestatic:
case TerminalTokens.TokenNameswitch:
case TerminalTokens.TokenNamestrictfp:
case TerminalTokens.TokenNamesynchronized:
case TerminalTokens.TokenNametry:
case TerminalTokens.TokenNamethis:
case TerminalTokens.TokenNametrue:
case TerminalTokens.TokenNamethrow:
case TerminalTokens.TokenNamethrows:
case TerminalTokens.TokenNametransient:
case TerminalTokens.TokenNamevoid:
case TerminalTokens.TokenNamevolatile:
case TerminalTokens.TokenNamewhile:
return true;
default:
return false;
}
}
private boolean isLiteral(int token) {
switch(token) {
case TerminalTokens.TokenNameIntegerLiteral:
case TerminalTokens.TokenNameLongLiteral:
case TerminalTokens.TokenNameFloatingPointLiteral:
case TerminalTokens.TokenNameDoubleLiteral:
case TerminalTokens.TokenNameStringLiteral:
case TerminalTokens.TokenNameCharacterLiteral:
return true;
default:
return false;
}
}
public void javadocAmbiguousMethodReference(int sourceStart, int sourceEnd, Binding fieldBinding, int modifiers) {
int id = IProblem.JavadocAmbiguousMethodReference;
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
String[] arguments = new String[] {new String(fieldBinding.readableName())};
handle(id, arguments, arguments, sourceStart, sourceEnd);
}
}
public void javadocDeprecatedField(FieldBinding field, ASTNode location, int modifiers) {
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
this.handle(
IProblem.JavadocUsingDeprecatedField,
new String[] {new String(field.declaringClass.readableName()), new String(field.name)},
new String[] {new String(field.declaringClass.shortReadableName()), new String(field.name)},
location.sourceStart,
location.sourceEnd);
}
}
public void javadocDeprecatedMethod(MethodBinding method, ASTNode location, int modifiers) {
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
if (method.isConstructor()) {
this.handle(
IProblem.JavadocUsingDeprecatedConstructor,
new String[] {new String(method.declaringClass.readableName()), parametersAsString(method.parameters, false)},
new String[] {new String(method.declaringClass.shortReadableName()), parametersAsString(method.parameters, true)},
location.sourceStart,
location.sourceEnd);
} else {
this.handle(
IProblem.JavadocUsingDeprecatedMethod,
new String[] {new String(method.declaringClass.readableName()), new String(method.selector), parametersAsString(method.parameters, false)},
new String[] {new String(method.declaringClass.shortReadableName()), new String(method.selector), parametersAsString(method.parameters, true)},
location.sourceStart,
location.sourceEnd);
}
}
}
public void javadocDeprecatedType(TypeBinding type, ASTNode location, int modifiers) {
if (location == null) return; // 1G828DN - no type ref for synthetic arguments
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
this.handle(
IProblem.JavadocUsingDeprecatedType,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
}
public void javadocDuplicatedParamTag(JavadocSingleNameReference param, int modifiers) {
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
String[] arguments = new String[] {String.valueOf(param.token)};
this.handle(IProblem.JavadocDuplicateParamName, arguments, arguments, param.sourceStart, param.sourceEnd);
}
}
public void javadocDuplicatedReturnTag(int sourceStart, int sourceEnd){
this.handle(IProblem.JavadocDuplicateReturnTag, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocDuplicatedThrowsClassName(TypeReference typeReference, int modifiers) {
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
String[] arguments = new String[] {String.valueOf(typeReference.resolvedType.sourceName())};
this.handle(IProblem.JavadocDuplicateThrowsClassName, arguments, arguments, typeReference.sourceStart, typeReference.sourceEnd);
}
}
public void javadocEmptyReturnTag(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocEmptyReturnTag, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocErrorNoMethodFor(MessageSend messageSend, TypeBinding recType, TypeBinding[] params, int modifiers) {
StringBuffer buffer = new StringBuffer();
StringBuffer shortBuffer = new StringBuffer();
for (int i = 0, length = params.length; i < length; i++) {
if (i != 0){
buffer.append(", "); //$NON-NLS-1$
shortBuffer.append(", "); //$NON-NLS-1$
}
buffer.append(new String(params[i].readableName()));
shortBuffer.append(new String(params[i].shortReadableName()));
}
int id = recType.isArrayType() ? IProblem.JavadocNoMessageSendOnArrayType : IProblem.JavadocNoMessageSendOnBaseType;
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
this.handle(
id,
new String[] {new String(recType.readableName()), new String(messageSend.selector), buffer.toString()},
new String[] {new String(recType.shortReadableName()), new String(messageSend.selector), shortBuffer.toString()},
messageSend.sourceStart,
messageSend.sourceEnd);
}
}
public void javadocInvalidConstructor(Statement statement, MethodBinding targetConstructor, int modifiers) {
if (!javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
return;
}
// boolean insideDefaultConstructor =
// (this.referenceContext instanceof ConstructorDeclaration)
// && ((ConstructorDeclaration)this.referenceContext).isDefaultConstructor();
// boolean insideImplicitConstructorCall =
// (statement instanceof ExplicitConstructorCall)
// && (((ExplicitConstructorCall) statement).accessMode == ExplicitConstructorCall.ImplicitSuper);
int id = IProblem.JavadocUndefinedConstructor; //default...
switch (targetConstructor.problemId()) {
case NotFound :
// if (insideDefaultConstructor){
// id = IProblem.JavadocUndefinedConstructorInDefaultConstructor;
// } else if (insideImplicitConstructorCall){
// id = IProblem.JavadocUndefinedConstructorInImplicitConstructorCall;
// } else {
id = IProblem.JavadocUndefinedConstructor;
// }
break;
case NotVisible :
// if (insideDefaultConstructor){
// id = IProblem.JavadocNotVisibleConstructorInDefaultConstructor;
// } else if (insideImplicitConstructorCall){
// id = IProblem.JavadocNotVisibleConstructorInImplicitConstructorCall;
// } else {
id = IProblem.JavadocNotVisibleConstructor;
// }
break;
case Ambiguous :
// if (insideDefaultConstructor){
// id = IProblem.AmbiguousConstructorInDefaultConstructor;
// } else if (insideImplicitConstructorCall){
// id = IProblem.AmbiguousConstructorInImplicitConstructorCall;
// } else {
id = IProblem.JavadocAmbiguousConstructor;
// }
break;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
this.handle(
id,
new String[] {new String(targetConstructor.declaringClass.readableName()), parametersAsString(targetConstructor.parameters, false)},
new String[] {new String(targetConstructor.declaringClass.shortReadableName()), parametersAsString(targetConstructor.parameters, true)},
statement.sourceStart,
statement.sourceEnd);
}
/*
* Similar implementation than invalidField(FieldReference...)
* Note that following problem id cannot occur for Javadoc:
* - NonStaticReferenceInStaticContext :
* - NonStaticReferenceInConstructorInvocation :
* - ReceiverTypeNotVisible :
*/
public void javadocInvalidField(int sourceStart, int sourceEnd, Binding fieldBinding, TypeBinding searchedType, int modifiers) {
int id = IProblem.JavadocUndefinedField;
switch (fieldBinding.problemId()) {
case NotFound :
id = IProblem.JavadocUndefinedField;
break;
case NotVisible :
id = IProblem.JavadocNotVisibleField;
break;
case Ambiguous :
id = IProblem.JavadocAmbiguousField;
break;
case InheritedNameHidesEnclosingName :
id = IProblem.JavadocInheritedFieldHidesEnclosingName;
break;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
String[] arguments = new String[] {new String(fieldBinding.readableName())};
handle(id, arguments, arguments, sourceStart, sourceEnd);
}
}
/*
* Similar implementation than invalidMethod(MessageSend...)
* Note that following problem id cannot occur for Javadoc:
* - NonStaticReferenceInStaticContext :
* - NonStaticReferenceInConstructorInvocation :
* - ReceiverTypeNotVisible :
*/
public void javadocInvalidMethod(MessageSend messageSend, MethodBinding method, int modifiers) {
if (!javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
return;
}
int id = IProblem.JavadocUndefinedMethod; //default...
switch (method.problemId()) {
case NotFound :
id = IProblem.JavadocUndefinedMethod;
break;
case NotVisible :
id = IProblem.JavadocNotVisibleMethod;
break;
case Ambiguous :
id = IProblem.JavadocAmbiguousMethod;
break;
case InheritedNameHidesEnclosingName :
id = IProblem.JavadocInheritedMethodHidesEnclosingName;
break;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
if (id == IProblem.JavadocUndefinedMethod) {
ProblemMethodBinding problemMethod = (ProblemMethodBinding) method;
if (problemMethod.closestMatch != null) {
String closestParameterTypeNames = parametersAsString(problemMethod.closestMatch.parameters, false);
String parameterTypeNames = parametersAsString(method.parameters, false);
String closestParameterTypeShortNames = parametersAsString(problemMethod.closestMatch.parameters, true);
String parameterTypeShortNames = parametersAsString(method.parameters, true);
if (closestParameterTypeShortNames.equals(parameterTypeShortNames)){
closestParameterTypeShortNames = closestParameterTypeNames;
parameterTypeShortNames = parameterTypeNames;
}
this.handle(
IProblem.JavadocParameterMismatch,
new String[] {
new String(problemMethod.closestMatch.declaringClass.readableName()),
new String(problemMethod.closestMatch.selector),
closestParameterTypeNames,
parameterTypeNames
},
new String[] {
new String(problemMethod.closestMatch.declaringClass.shortReadableName()),
new String(problemMethod.closestMatch.selector),
closestParameterTypeShortNames,
parameterTypeShortNames
},
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
return;
}
}
this.handle(
id,
new String[] {
new String(method.declaringClass.readableName()),
new String(method.selector), parametersAsString(method.parameters, false)},
new String[] {
new String(method.declaringClass.shortReadableName()),
new String(method.selector), parametersAsString(method.parameters, true)},
(int) (messageSend.nameSourcePosition >>> 32),
(int) messageSend.nameSourcePosition);
}
public void javadocInvalidParamName(JavadocSingleNameReference param, int modifiers) {
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
String[] arguments = new String[] {String.valueOf(param.token)};
this.handle(IProblem.JavadocInvalidParamName, arguments, arguments, param.sourceStart, param.sourceEnd);
}
}
public void javadocInvalidReference(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocInvalidReference, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocInvalidSeeReferenceArgs(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocInvalidSeeArgs, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocInvalidSeeUrlReference(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocInvalidSeeHref, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocInvalidTag(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocInvalidTag, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocInvalidThrowsClass(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocInvalidThrowsClass, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocInvalidThrowsClassName(TypeReference typeReference, int modifiers) {
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
String[] arguments = new String[] {String.valueOf(typeReference.resolvedType.sourceName())};
this.handle(IProblem.JavadocInvalidThrowsClassName, arguments, arguments, typeReference.sourceStart, typeReference.sourceEnd);
}
}
public void javadocInvalidType(ASTNode location, TypeBinding type, int modifiers) {
if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
int id = IProblem.JavadocUndefinedType; // default
switch (type.problemId()) {
case NotFound :
id = IProblem.JavadocUndefinedType;
break;
case NotVisible :
id = IProblem.JavadocNotVisibleType;
break;
case Ambiguous :
id = IProblem.JavadocAmbiguousType;
break;
case InternalNameProvided :
id = IProblem.JavadocInternalTypeNameProvided;
break;
case InheritedNameHidesEnclosingName :
id = IProblem.JavadocInheritedNameHidesEnclosingTypeName;
break;
case NoError : // 0
default :
needImplementation(); // want to fail to see why we were here...
break;
}
this.handle(
id,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
}
public void javadocInvalidValueReference(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocInvalidValueReference, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocMalformedSeeReference(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocMalformedSeeReference, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocMissing(int sourceStart, int sourceEnd, int modifiers){
boolean overriding = (modifiers & (CompilerModifiers.AccImplementing+CompilerModifiers.AccOverriding)) != 0;
boolean report = (this.options.getSeverity(CompilerOptions.MissingJavadocComments) != ProblemSeverities.Ignore)
&& (!overriding || this.options.reportMissingJavadocCommentsOverriding);
if (report) {
String arg = javadocVisibilityArgument(this.options.reportMissingJavadocCommentsVisibility, modifiers);
if (arg != null) {
String[] arguments = new String[] { arg };
this.handle(IProblem.JavadocMissing, arguments, arguments, sourceStart, sourceEnd);
}
}
}
public void javadocMissingHashCharacter(int sourceStart, int sourceEnd, String ref){
String[] arguments = new String[] { ref };
this.handle(IProblem.JavadocMissingHashCharacter, arguments, arguments, sourceStart, sourceEnd);
}
public void javadocMissingParamName(int sourceStart, int sourceEnd){
this.handle(IProblem.JavadocMissingParamName, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocMissingParamTag(Argument param, int modifiers) {
boolean overriding = (modifiers & (CompilerModifiers.AccImplementing+CompilerModifiers.AccOverriding)) != 0;
boolean report = (this.options.getSeverity(CompilerOptions.MissingJavadocTags) != ProblemSeverities.Ignore)
&& (!overriding || this.options.reportMissingJavadocTagsOverriding);
if (report && javadocVisibility(this.options.reportMissingJavadocTagsVisibility, modifiers)) {
String[] arguments = new String[] { String.valueOf(param.name) };
this.handle(IProblem.JavadocMissingParamTag, arguments, arguments, param.sourceStart, param.sourceEnd);
}
}
public void javadocMissingReference(int sourceStart, int sourceEnd){
this.handle(IProblem.JavadocMissingReference, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocMissingReturnTag(int sourceStart, int sourceEnd, int modifiers){
boolean overriding = (modifiers & (CompilerModifiers.AccImplementing+CompilerModifiers.AccOverriding)) != 0;
boolean report = (this.options.getSeverity(CompilerOptions.MissingJavadocTags) != ProblemSeverities.Ignore)
&& (!overriding || this.options.reportMissingJavadocTagsOverriding);
if (report && javadocVisibility(this.options.reportMissingJavadocTagsVisibility, modifiers)) {
this.handle(IProblem.JavadocMissingReturnTag, NoArgument, NoArgument, sourceStart, sourceEnd);
}
}
public void javadocMissingThrowsClassName(int sourceStart, int sourceEnd){
this.handle(IProblem.JavadocMissingThrowsClassName, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocMissingThrowsTag(TypeReference typeRef, int modifiers){
boolean overriding = (modifiers & (CompilerModifiers.AccImplementing+CompilerModifiers.AccOverriding)) != 0;
boolean report = (this.options.getSeverity(CompilerOptions.MissingJavadocTags) != ProblemSeverities.Ignore)
&& (!overriding || this.options.reportMissingJavadocTagsOverriding);
if (report && javadocVisibility(this.options.reportMissingJavadocTagsVisibility, modifiers)) {
String[] arguments = new String[] { String.valueOf(typeRef.resolvedType.sourceName()) };
this.handle(IProblem.JavadocMissingThrowsTag, arguments, arguments, typeRef.sourceStart, typeRef.sourceEnd);
}
}
public void javadocUnexpectedTag(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocUnexpectedTag, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocUnexpectedText(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocUnexpectedText, NoArgument, NoArgument, sourceStart, sourceEnd);
}
public void javadocUnterminatedInlineTag(int sourceStart, int sourceEnd) {
this.handle(IProblem.JavadocUnterminatedInlineTag, NoArgument, NoArgument, sourceStart, sourceEnd);
}
private boolean javadocVisibility(int visibility, int modifiers) {
switch (modifiers & CompilerModifiers.AccVisibilityMASK) {
case IConstants.AccPublic :
return true;
case IConstants.AccProtected:
return (visibility != IConstants.AccPublic);
case IConstants.AccDefault:
return (visibility == IConstants.AccDefault || visibility == IConstants.AccPrivate);
case IConstants.AccPrivate:
return (visibility == IConstants.AccPrivate);
}
return true;
}
private String javadocVisibilityArgument(int visibility, int modifiers) {
String argument = null;
switch (modifiers & CompilerModifiers.AccVisibilityMASK) {
case IConstants.AccPublic :
argument = CompilerOptions.PUBLIC;
break;
case IConstants.AccProtected:
if (visibility != IConstants.AccPublic) {
argument = CompilerOptions.PROTECTED;
}
break;
case IConstants.AccDefault:
if (visibility == IConstants.AccDefault || visibility == IConstants.AccPrivate) {
argument = CompilerOptions.DEFAULT;
}
break;
case IConstants.AccPrivate:
if (visibility == IConstants.AccPrivate) {
argument = CompilerOptions.PRIVATE;
}
break;
}
return argument;
}
public void localVariableHiding(LocalDeclaration local, Binding hiddenVariable, boolean isSpecialArgHidingField) {
if (hiddenVariable instanceof LocalVariableBinding) {
String[] arguments = new String[] {new String(local.name) };
this.handle(
(local instanceof Argument)
? IProblem.ArgumentHidingLocalVariable
: IProblem.LocalVariableHidingLocalVariable,
arguments,
arguments,
local.sourceStart,
local.sourceEnd);
} else if (hiddenVariable instanceof FieldBinding) {
if (isSpecialArgHidingField && !this.options.reportSpecialParameterHidingField){
return;
}
FieldBinding field = (FieldBinding) hiddenVariable;
this.handle(
(local instanceof Argument)
? IProblem.ArgumentHidingField
: IProblem.LocalVariableHidingField,
new String[] {new String(local.name) , new String(field.declaringClass.readableName()) },
new String[] {new String(local.name), new String(field.declaringClass.shortReadableName()) },
local.sourceStart,
local.sourceEnd);
}
}
public void methodNameClash(MethodBinding currentMethod, MethodBinding inheritedMethod) {
this.handle(
IProblem.MethodNameClash,
new String[] {
new String(currentMethod.selector),
parametersAsString(currentMethod.original().parameters, false),
new String(currentMethod.declaringClass.readableName()),
parametersAsString(inheritedMethod.original().parameters, false),
new String(inheritedMethod.declaringClass.readableName()),
},
new String[] {
new String(currentMethod.selector),
parametersAsString(currentMethod.original().parameters, true),
new String(currentMethod.declaringClass.shortReadableName()),
parametersAsString(inheritedMethod.original().parameters, true),
new String(inheritedMethod.declaringClass.shortReadableName()),
},
currentMethod.sourceStart(),
currentMethod.sourceEnd());
}
public void methodNeedBody(AbstractMethodDeclaration methodDecl) {
this.handle(
IProblem.MethodRequiresBody,
NoArgument,
NoArgument,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void methodNeedingNoBody(MethodDeclaration methodDecl) {
this.handle(
((methodDecl.modifiers & IConstants.AccNative) != 0) ? IProblem.BodyForNativeMethod : IProblem.BodyForAbstractMethod,
NoArgument,
NoArgument,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void methodWithConstructorName(MethodDeclaration methodDecl) {
this.handle(
IProblem.MethodButWithConstructorName,
NoArgument,
NoArgument,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void parameterizedMemberTypeMissingArguments(ASTNode location, TypeBinding type) {
if (location == null) { // binary case
this.handle(
IProblem.MissingArgumentsForParameterizedMemberType,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
AbortCompilation | Error,
0,
1);
return;
}
this.handle(
IProblem.MissingArgumentsForParameterizedMemberType,
new String[] {new String(type.readableName())},
new String[] {new String(type.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void missingReturnType(AbstractMethodDeclaration methodDecl) {
this.handle(
IProblem.MissingReturnType,
NoArgument,
NoArgument,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void missingSemiColon(Expression expression){
this.handle(
IProblem.MissingSemiColon,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void missingSerialVersion(TypeDeclaration typeDecl) {
String[] arguments = new String[] {new String(typeDecl.name)};
this.handle(
IProblem.MissingSerialVersion,
arguments,
arguments,
typeDecl.sourceStart,
typeDecl.sourceEnd);
}
public void mustDefineDimensionsOrInitializer(ArrayAllocationExpression expression) {
this.handle(
IProblem.MustDefineEitherDimensionExpressionsOrInitializer,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void mustSpecifyPackage(CompilationUnitDeclaration compUnitDecl) {
String[] arguments = new String[] {new String(compUnitDecl.getFileName())};
this.handle(
IProblem.MustSpecifyPackage,
arguments,
arguments,
compUnitDecl.sourceStart,
compUnitDecl.sourceStart + 1);
}
public void mustUseAStaticMethod(MessageSend messageSend, MethodBinding method) {
this.handle(
IProblem.StaticMethodRequested,
new String[] {new String(method.declaringClass.readableName()), new String(method.selector), parametersAsString(method.parameters, false)},
new String[] {new String(method.declaringClass.shortReadableName()), new String(method.selector), parametersAsString(method.parameters, true)},
messageSend.sourceStart,
messageSend.sourceEnd);
}
public void nativeMethodsCannotBeStrictfp(ReferenceBinding type, AbstractMethodDeclaration methodDecl) {
String[] arguments = new String[] {new String(type.sourceName()), new String(methodDecl.selector)};
this.handle(
IProblem.NativeMethodsCannotBeStrictfp,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void needImplementation() {
this.abortDueToInternalError(Util.bind("abort.missingCode")); //$NON-NLS-1$
}
public void needToEmulateFieldAccess(FieldBinding field, ASTNode location, boolean isReadAccess) {
this.handle(
isReadAccess
? IProblem.NeedToEmulateFieldReadAccess
: IProblem.NeedToEmulateFieldWriteAccess,
new String[] {new String(field.declaringClass.readableName()), new String(field.name)},
new String[] {new String(field.declaringClass.shortReadableName()), new String(field.name)},
location.sourceStart,
location.sourceEnd);
}
public void needToEmulateMethodAccess(
MethodBinding method,
ASTNode location) {
if (method.isConstructor())
this.handle(
IProblem.NeedToEmulateConstructorAccess,
new String[] {
new String(method.declaringClass.readableName()),
parametersAsString(method.parameters, false)
},
new String[] {
new String(method.declaringClass.shortReadableName()),
parametersAsString(method.parameters, true)
},
location.sourceStart,
location.sourceEnd);
else
this.handle(
IProblem.NeedToEmulateMethodAccess,
new String[] {
new String(method.declaringClass.readableName()),
new String(method.selector),
parametersAsString(method.parameters, false)
},
new String[] {
new String(method.declaringClass.shortReadableName()),
new String(method.selector),
parametersAsString(method.parameters, true)
},
location.sourceStart,
location.sourceEnd);
}
public void nestedClassCannotDeclareInterface(TypeDeclaration typeDecl) {
String[] arguments = new String[] {new String(typeDecl.name)};
this.handle(
IProblem.CannotDefineInterfaceInLocalType,
arguments,
arguments,
typeDecl.sourceStart,
typeDecl.sourceEnd);
}
public void noMoreAvailableSpaceForArgument(LocalVariableBinding local, ASTNode location) {
String[] arguments = new String[]{ new String(local.name) };
this.handle(
local instanceof SyntheticArgumentBinding
? IProblem.TooManySyntheticArgumentSlots
: IProblem.TooManyArgumentSlots,
arguments,
arguments,
Abort | Error,
location.sourceStart,
location.sourceEnd);
}
public void noMoreAvailableSpaceForConstant(TypeDeclaration typeDeclaration) {
this.handle(
IProblem.TooManyBytesForStringConstant,
new String[]{ new String(typeDeclaration.binding.readableName())},
new String[]{ new String(typeDeclaration.binding.shortReadableName())},
Abort | Error,
typeDeclaration.sourceStart,
typeDeclaration.sourceEnd);
}
public void noMoreAvailableSpaceForLocal(LocalVariableBinding local, ASTNode location) {
String[] arguments = new String[]{ new String(local.name) };
this.handle(
IProblem.TooManyLocalVariableSlots,
arguments,
arguments,
Abort | Error,
location.sourceStart,
location.sourceEnd);
}
public void noMoreAvailableSpaceInConstantPool(TypeDeclaration typeDeclaration) {
this.handle(
IProblem.TooManyConstantsInConstantPool,
new String[]{ new String(typeDeclaration.binding.readableName())},
new String[]{ new String(typeDeclaration.binding.shortReadableName())},
Abort | Error,
typeDeclaration.sourceStart,
typeDeclaration.sourceEnd);
}
public void nonExternalizedStringLiteral(ASTNode location) {
this.handle(
IProblem.NonExternalizedStringLiteral,
NoArgument,
NoArgument,
location.sourceStart,
location.sourceEnd);
}
public void nonGenericTypeCannotBeParameterized(ASTNode location, TypeBinding type, TypeBinding[] argumentTypes) {
if (location == null) { // binary case
this.handle(
IProblem.NonGenericType,
new String[] {new String(type.readableName()), parametersAsString(argumentTypes, false)},
new String[] {new String(type.shortReadableName()), parametersAsString(argumentTypes, true)},
AbortCompilation | Error,
0,
1);
return;
}
this.handle(
IProblem.NonGenericType,
new String[] {new String(type.readableName()), parametersAsString(argumentTypes, false)},
new String[] {new String(type.shortReadableName()), parametersAsString(argumentTypes, true)},
location.sourceStart,
location.sourceEnd);
}
public void nonStaticAccessToStaticField(ASTNode location, FieldBinding field) {
this.handle(
IProblem.NonStaticAccessToStaticField,
new String[] {new String(field.declaringClass.readableName()), new String(field.name)},
new String[] {new String(field.declaringClass.shortReadableName()), new String(field.name)},
location.sourceStart,
fieldLocation(field, location));
}
public void nonStaticAccessToStaticMethod(ASTNode location, MethodBinding method) {
this.handle(
IProblem.NonStaticAccessToStaticMethod,
new String[] {new String(method.declaringClass.readableName()), new String(method.selector), parametersAsString(method.parameters, false)},
new String[] {new String(method.declaringClass.shortReadableName()), new String(method.selector), parametersAsString(method.parameters, true)},
location.sourceStart,
location.sourceEnd);
}
public void noSuchEnclosingInstance(TypeBinding targetType, ASTNode location, boolean isConstructorCall) {
int id;
if (isConstructorCall) {
//28 = No enclosing instance of type {0} is available due to some intermediate constructor invocation
id = IProblem.EnclosingInstanceInConstructorCall;
} else if ((location instanceof ExplicitConstructorCall)
&& ((ExplicitConstructorCall) location).accessMode == ExplicitConstructorCall.ImplicitSuper) {
//20 = No enclosing instance of type {0} is accessible to invoke the super constructor. Must define a constructor and explicitly qualify its super constructor invocation with an instance of {0} (e.g. x.super() where x is an instance of {0}).
id = IProblem.MissingEnclosingInstanceForConstructorCall;
} else if (location instanceof AllocationExpression
&& (((AllocationExpression) location).binding.declaringClass.isMemberType()
|| (((AllocationExpression) location).binding.declaringClass.isAnonymousType()
&& ((AllocationExpression) location).binding.declaringClass.superclass().isMemberType()))) {
//21 = No enclosing instance of type {0} is accessible. Must qualify the allocation with an enclosing instance of type {0} (e.g. x.new A() where x is an instance of {0}).
id = IProblem.MissingEnclosingInstance;
} else { // default
//22 = No enclosing instance of the type {0} is accessible in scope
id = IProblem.IncorrectEnclosingInstanceReference;
}
this.handle(
id,
new String[] { new String(targetType.readableName())},
new String[] { new String(targetType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void notCompatibleTypesError(EqualExpression expression, TypeBinding leftType, TypeBinding rightType) {
String leftName = new String(leftType.readableName());
String rightName = new String(rightType.readableName());
String leftShortName = new String(leftType.shortReadableName());
String rightShortName = new String(rightType.shortReadableName());
if (leftShortName.equals(rightShortName)){
leftShortName = leftName;
rightShortName = rightName;
}
this.handle(
IProblem.IncompatibleTypesInEqualityOperator,
new String[] {leftName, rightName },
new String[] {leftShortName, rightShortName },
expression.sourceStart,
expression.sourceEnd);
}
public void notCompatibleTypesError(InstanceOfExpression expression, TypeBinding leftType, TypeBinding rightType) {
String leftName = new String(leftType.readableName());
String rightName = new String(rightType.readableName());
String leftShortName = new String(leftType.shortReadableName());
String rightShortName = new String(rightType.shortReadableName());
if (leftShortName.equals(rightShortName)){
leftShortName = leftName;
rightShortName = rightName;
}
this.handle(
IProblem.IncompatibleTypesInConditionalOperator,
new String[] {leftName, rightName },
new String[] {leftShortName, rightShortName },
expression.sourceStart,
expression.sourceEnd);
}
public void notCompatibleTypesErrorInForeach(Expression expression, TypeBinding leftType, TypeBinding rightType) {
String leftName = new String(leftType.readableName());
String rightName = new String(rightType.readableName());
String leftShortName = new String(leftType.shortReadableName());
String rightShortName = new String(rightType.shortReadableName());
if (leftShortName.equals(rightShortName)){
leftShortName = leftName;
rightShortName = rightName;
}
this.handle(
IProblem.IncompatibleTypesInForeach,
new String[] {leftName, rightName },
new String[] {leftShortName, rightShortName },
expression.sourceStart,
expression.sourceEnd);
}
public void objectCannotBeGeneric(TypeDeclaration typeDecl) {
this.handle(
IProblem.ObjectCannotBeGeneric,
NoArgument,
NoArgument,
typeDecl.typeParameters[0].sourceStart,
typeDecl.typeParameters[typeDecl.typeParameters.length-1].sourceEnd);
}
public void objectCannotHaveSuperTypes(SourceTypeBinding type) {
this.handle(
IProblem.ObjectCannotHaveSuperTypes,
NoArgument,
NoArgument,
type.sourceStart(),
type.sourceEnd());
}
public void operatorOnlyValidOnNumericType(CompoundAssignment assignment, TypeBinding leftType, TypeBinding rightType) {
String leftName = new String(leftType.readableName());
String rightName = new String(rightType.readableName());
String leftShortName = new String(leftType.shortReadableName());
String rightShortName = new String(rightType.shortReadableName());
if (leftShortName.equals(rightShortName)){
leftShortName = leftName;
rightShortName = rightName;
}
this.handle(
IProblem.TypeMismatch,
new String[] {leftName, rightName },
new String[] {leftShortName, rightShortName },
assignment.sourceStart,
assignment.sourceEnd);
}
public void overridesDeprecatedMethod(MethodBinding localMethod, MethodBinding inheritedMethod) {
this.handle(
IProblem.OverridingDeprecatedMethod,
new String[] {
new String(
CharOperation.concat(
localMethod.declaringClass.readableName(),
localMethod.readableName(),
'.')),
new String(inheritedMethod.declaringClass.readableName())},
new String[] {
new String(
CharOperation.concat(
localMethod.declaringClass.shortReadableName(),
localMethod.shortReadableName(),
'.')),
new String(inheritedMethod.declaringClass.shortReadableName())},
localMethod.sourceStart(),
localMethod.sourceEnd());
}
public void overridesPackageDefaultMethod(MethodBinding localMethod, MethodBinding inheritedMethod) {
this.handle(
IProblem.OverridingNonVisibleMethod,
new String[] {
new String(
CharOperation.concat(
localMethod.declaringClass.readableName(),
localMethod.readableName(),
'.')),
new String(inheritedMethod.declaringClass.readableName())},
new String[] {
new String(
CharOperation.concat(
localMethod.declaringClass.shortReadableName(),
localMethod.shortReadableName(),
'.')),
new String(inheritedMethod.declaringClass.shortReadableName())},
localMethod.sourceStart(),
localMethod.sourceEnd());
}
public void packageCollidesWithType(CompilationUnitDeclaration compUnitDecl) {
String[] arguments = new String[] {CharOperation.toString(compUnitDecl.currentPackage.tokens)};
this.handle(
IProblem.PackageCollidesWithType,
arguments,
arguments,
compUnitDecl.currentPackage.sourceStart,
compUnitDecl.currentPackage.sourceEnd);
}
public void packageIsNotExpectedPackage(CompilationUnitDeclaration compUnitDecl) {
String[] arguments = new String[] {CharOperation.toString(compUnitDecl.compilationResult.compilationUnit.getPackageName())};
this.handle(
IProblem.PackageIsNotExpectedPackage,
arguments,
arguments,
compUnitDecl.currentPackage == null ? 0 : compUnitDecl.currentPackage.sourceStart,
compUnitDecl.currentPackage == null ? 0 : compUnitDecl.currentPackage.sourceEnd);
}
private String parameterBoundAsString(TypeVariableBinding typeVariable, boolean makeShort) {
StringBuffer nameBuffer = new StringBuffer(10);
if (typeVariable.firstBound == typeVariable.superclass) {
nameBuffer.append(makeShort ? typeVariable.superclass.shortReadableName() : typeVariable.superclass.readableName());
}
int length;
if ((length = typeVariable.superInterfaces.length) > 0) {
for (int i = 0; i < length; i++) {
if (i > 0 || typeVariable.firstBound == typeVariable.superclass) nameBuffer.append(" & "); //$NON-NLS-1$
nameBuffer.append(makeShort ? typeVariable.superInterfaces[i].shortReadableName() : typeVariable.superInterfaces[i].readableName());
}
}
return nameBuffer.toString();
}
private String parametersAsString(TypeBinding[] params, boolean makeShort) {
StringBuffer buffer = new StringBuffer(10);
for (int i = 0, length = params.length; i < length; i++) {
if (i != 0)
buffer.append(", "); //$NON-NLS-1$
buffer.append(new String(makeShort ? params[i].shortReadableName() : params[i].readableName()));
}
return buffer.toString();
}
public void parseError(
int startPosition,
int endPosition,
int currentToken,
char[] currentTokenSource,
String errorTokenName,
String[] possibleTokens) {
if (possibleTokens.length == 0) { //no suggestion available
if (isKeyword(currentToken)) {
String[] arguments = new String[] {new String(currentTokenSource)};
this.handle(
IProblem.ParsingErrorOnKeywordNoSuggestion,
arguments,
arguments,
// this is the current -invalid- token position
startPosition,
endPosition);
return;
} else {
String[] arguments = new String[] {errorTokenName};
this.handle(
IProblem.ParsingErrorNoSuggestion,
arguments,
arguments,
// this is the current -invalid- token position
startPosition,
endPosition);
return;
}
}
//build a list of probable right tokens
StringBuffer list = new StringBuffer(20);
for (int i = 0, max = possibleTokens.length; i < max; i++) {
if (i > 0)
list.append(", "); //$NON-NLS-1$
list.append('"');
list.append(possibleTokens[i]);
list.append('"');
}
if (isKeyword(currentToken)) {
String[] arguments = new String[] {new String(currentTokenSource), list.toString()};
this.handle(
IProblem.ParsingErrorOnKeyword,
arguments,
arguments,
// this is the current -invalid- token position
startPosition,
endPosition);
return;
}
//extract the literal when it's a literal
if (isLiteral(currentToken) ||
isIdentifier(currentToken)) { //$NON-NLS-1$
errorTokenName = new String(currentTokenSource);
}
String[] arguments = new String[] {errorTokenName, list.toString()};
this.handle(
IProblem.ParsingError,
arguments,
arguments,
// this is the current -invalid- token position
startPosition,
endPosition);
}
public void parseErrorDeleteToken(
int start,
int end,
int currentKind,
char[] errorTokenSource,
String errorTokenName){
this.syntaxError(
IProblem.ParsingErrorDeleteToken,
start,
end,
currentKind,
errorTokenSource,
errorTokenName,
null);
}
public void parseErrorDeleteTokens(
int start,
int end){
this.handle(
IProblem.ParsingErrorDeleteTokens,
NoArgument,
NoArgument,
start,
end);
}
public void parseErrorInsertAfterToken(
int start,
int end,
int currentKind,
char[] errorTokenSource,
String errorTokenName,
String expectedToken){
this.syntaxError(
IProblem.ParsingErrorInsertTokenAfter,
start,
end,
currentKind,
errorTokenSource,
errorTokenName,
expectedToken);
}
public void parseErrorInsertBeforeToken(
int start,
int end,
int currentKind,
char[] errorTokenSource,
String errorTokenName,
String expectedToken){
this.syntaxError(
IProblem.ParsingErrorInsertTokenBefore,
start,
end,
currentKind,
errorTokenSource,
errorTokenName,
expectedToken);
}
public void parseErrorInsertToComplete(
int start,
int end,
String inserted,
String completed){
String[] arguments = new String[] {inserted, completed};
this.handle(
IProblem.ParsingErrorInsertToComplete,
arguments,
arguments,
start,
end);
}
public void parseErrorInsertToCompletePhrase(
int start,
int end,
String inserted){
String[] arguments = new String[] {inserted};
this.handle(
IProblem.ParsingErrorInsertToCompletePhrase,
arguments,
arguments,
start,
end);
}
public void parseErrorInsertToCompleteScope(
int start,
int end,
String inserted){
String[] arguments = new String[] {inserted};
this.handle(
IProblem.ParsingErrorInsertToCompleteScope,
arguments,
arguments,
start,
end);
}
public void parseErrorInvalidToken(
int start,
int end,
int currentKind,
char[] errorTokenSource,
String errorTokenName,
String expectedToken){
this.syntaxError(
IProblem.ParsingErrorInvalidToken,
start,
end,
currentKind,
errorTokenSource,
errorTokenName,
expectedToken);
}
public void parseErrorMergeTokens(
int start,
int end,
String expectedToken){
String[] arguments = new String[] {expectedToken};
this.handle(
IProblem.ParsingErrorMergeTokens,
arguments,
arguments,
start,
end);
}
public void parseErrorMisplacedConstruct(
int start,
int end){
this.handle(
IProblem.ParsingErrorMisplacedConstruct,
NoArgument,
NoArgument,
start,
end);
}
public void parseErrorNoSuggestion(
int start,
int end,
int currentKind,
char[] errorTokenSource,
String errorTokenName){
this.syntaxError(
IProblem.ParsingErrorNoSuggestion,
start,
end,
currentKind,
errorTokenSource,
errorTokenName,
null);
}
public void parseErrorNoSuggestionForTokens(
int start,
int end){
this.handle(
IProblem.ParsingErrorNoSuggestionForTokens,
NoArgument,
NoArgument,
start,
end);
}
public void parseErrorReplaceToken(
int start,
int end,
int currentKind,
char[] errorTokenSource,
String errorTokenName,
String expectedToken){
this.syntaxError(
IProblem.ParsingError,
start,
end,
currentKind,
errorTokenSource,
errorTokenName,
expectedToken);
}
public void parseErrorReplaceTokens(
int start,
int end,
String expectedToken){
String[] arguments = new String[] {expectedToken};
this.handle(
IProblem.ParsingErrorReplaceTokens,
arguments,
arguments,
start,
end);
}
public void parseErrorUnexpectedEnd(
int start,
int end){
String[] arguments;
if(this.referenceContext instanceof ConstructorDeclaration) {
arguments = new String[] {Util.bind("parser.endOfConstructor")}; //$NON-NLS-1$
} else if(this.referenceContext instanceof MethodDeclaration) {
arguments = new String[] {Util.bind("parser.endOfMethod")}; //$NON-NLS-1$
} else if(this.referenceContext instanceof TypeDeclaration) {
arguments = new String[] {Util.bind("parser.endOfInitializer")}; //$NON-NLS-1$
} else {
arguments = new String[] {Util.bind("parser.endOfFile")}; //$NON-NLS-1$
}
this.handle(
IProblem.ParsingErrorUnexpectedEOF,
arguments,
arguments,
start,
end);
}
public void possibleAccidentalBooleanAssignment(Assignment assignment) {
this.handle(
IProblem.PossibleAccidentalBooleanAssignment,
NoArgument,
NoArgument,
assignment.sourceStart,
assignment.sourceEnd);
}
public void publicClassMustMatchFileName(CompilationUnitDeclaration compUnitDecl, TypeDeclaration typeDecl) {
this.referenceContext = typeDecl; // report the problem against the type not the entire compilation unit
String[] arguments = new String[] {new String(compUnitDecl.getFileName()), new String(typeDecl.name)};
this.handle(
IProblem.PublicClassMustMatchFileName,
arguments,
arguments,
typeDecl.sourceStart,
typeDecl.sourceEnd,
compUnitDecl.compilationResult);
}
public void rawMemberTypeCannotBeParameterized(ASTNode location, ReferenceBinding type, TypeBinding[] argumentTypes) {
if (location == null) { // binary case
this.handle(
IProblem.RawMemberTypeCannotBeParameterized,
new String[] {new String(type.readableName()), parametersAsString(argumentTypes, false), new String(type.enclosingType().readableName())},
new String[] {new String(type.shortReadableName()), parametersAsString(argumentTypes, true), new String(type.enclosingType().shortReadableName())},
AbortCompilation | Error,
0,
1);
return;
}
this.handle(
IProblem.RawMemberTypeCannotBeParameterized,
new String[] {new String(type.readableName()), parametersAsString(argumentTypes, false), new String(type.enclosingType().readableName())},
new String[] {new String(type.shortReadableName()), parametersAsString(argumentTypes, true), new String(type.enclosingType().shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void recursiveConstructorInvocation(ExplicitConstructorCall constructorCall) {
this.handle(
IProblem.RecursiveConstructorInvocation,
new String[] {
new String(constructorCall.binding.declaringClass.readableName()),
parametersAsString(constructorCall.binding.parameters, false)
},
new String[] {
new String(constructorCall.binding.declaringClass.shortReadableName()),
parametersAsString(constructorCall.binding.parameters, true)
},
constructorCall.sourceStart,
constructorCall.sourceEnd);
}
public void redefineArgument(Argument arg) {
String[] arguments = new String[] {new String(arg.name)};
this.handle(
IProblem.RedefinedArgument,
arguments,
arguments,
arg.sourceStart,
arg.sourceEnd);
}
public void redefineLocal(LocalDeclaration localDecl) {
String[] arguments = new String[] {new String(localDecl.name)};
this.handle(
IProblem.RedefinedLocal,
arguments,
arguments,
localDecl.sourceStart,
localDecl.sourceEnd);
}
public void referenceMustBeArrayTypeAt(TypeBinding arrayType, ArrayReference arrayRef) {
this.handle(
IProblem.ArrayReferenceRequired,
new String[] {new String(arrayType.readableName())},
new String[] {new String(arrayType.shortReadableName())},
arrayRef.sourceStart,
arrayRef.sourceEnd);
}
public void returnTypeCannotBeVoidArray(SourceTypeBinding type, MethodDeclaration methodDecl) {
String[] arguments = new String[] {new String(methodDecl.selector)};
this.handle(
IProblem.ReturnTypeCannotBeVoidArray,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void scannerError(Parser parser, String errorTokenName) {
Scanner scanner = parser.scanner;
int flag = IProblem.ParsingErrorNoSuggestion;
int startPos = scanner.startPosition;
//special treatment for recognized errors....
if (errorTokenName.equals(Scanner.END_OF_SOURCE))
flag = IProblem.EndOfSource;
else if (errorTokenName.equals(Scanner.INVALID_HEXA))
flag = IProblem.InvalidHexa;
else if (errorTokenName.equals(Scanner.INVALID_OCTAL))
flag = IProblem.InvalidOctal;
else if (errorTokenName.equals(Scanner.INVALID_CHARACTER_CONSTANT))
flag = IProblem.InvalidCharacterConstant;
else if (errorTokenName.equals(Scanner.INVALID_ESCAPE))
flag = IProblem.InvalidEscape;
else if (errorTokenName.equals(Scanner.INVALID_UNICODE_ESCAPE)){
flag = IProblem.InvalidUnicodeEscape;
// better locate the error message
char[] source = scanner.source;
int checkPos = scanner.currentPosition - 1;
if (checkPos >= source.length) checkPos = source.length - 1;
while (checkPos >= startPos){
if (source[checkPos] == '\\') break;
checkPos --;
}
startPos = checkPos;
} else if (errorTokenName.equals(Scanner.INVALID_FLOAT))
flag = IProblem.InvalidFloat;
else if (errorTokenName.equals(Scanner.UNTERMINATED_STRING))
flag = IProblem.UnterminatedString;
else if (errorTokenName.equals(Scanner.UNTERMINATED_COMMENT))
flag = IProblem.UnterminatedComment;
else if (errorTokenName.equals(Scanner.INVALID_CHAR_IN_STRING))
flag = IProblem.UnterminatedString;
else if (errorTokenName.equals(Scanner.INVALID_DIGIT))
flag = IProblem.InvalidDigit;
String[] arguments = flag == IProblem.ParsingErrorNoSuggestion
? new String[] {errorTokenName}
: NoArgument;
this.handle(
flag,
arguments,
arguments,
// this is the current -invalid- token position
startPos,
scanner.currentPosition - 1,
parser.compilationUnit.compilationResult);
}
public void shouldReturn(TypeBinding returnType, ASTNode location) {
this.handle(
IProblem.ShouldReturnValue,
new String[] { new String (returnType.readableName())},
new String[] { new String (returnType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void signalNoImplicitStringConversionForCharArrayExpression(Expression expression) {
this.handle(
IProblem.NoImplicitStringConversionForCharArrayExpression,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void staticAndInstanceConflict(MethodBinding currentMethod, MethodBinding inheritedMethod) {
if (currentMethod.isStatic())
this.handle(
// This static method cannot hide the instance method from %1
// 8.4.6.4 - If a class inherits more than one method with the same signature a static (non-abstract) method cannot hide an instance method.
IProblem.CannotHideAnInstanceMethodWithAStaticMethod,
new String[] {new String(inheritedMethod.declaringClass.readableName())},
new String[] {new String(inheritedMethod.declaringClass.shortReadableName())},
currentMethod.sourceStart(),
currentMethod.sourceEnd());
else
this.handle(
// This instance method cannot override the static method from %1
// 8.4.6.4 - If a class inherits more than one method with the same signature an instance (non-abstract) method cannot override a static method.
IProblem.CannotOverrideAStaticMethodWithAnInstanceMethod,
new String[] {new String(inheritedMethod.declaringClass.readableName())},
new String[] {new String(inheritedMethod.declaringClass.shortReadableName())},
currentMethod.sourceStart(),
currentMethod.sourceEnd());
}
public void staticFieldAccessToNonStaticVariable(ASTNode location, FieldBinding field) {
String[] arguments = new String[] {new String(field.readableName())};
this.handle(
IProblem.NonStaticFieldFromStaticInvocation,
arguments,
arguments,
location.sourceStart,
fieldLocation(field, location));
}
public void staticInheritedMethodConflicts(SourceTypeBinding type, MethodBinding concreteMethod, MethodBinding[] abstractMethods) {
this.handle(
// The static method %1 conflicts with the abstract method in %2
// 8.4.6.4 - If a class inherits more than one method with the same signature it is an error for one to be static (non-abstract) and the other abstract.
IProblem.StaticInheritedMethodConflicts,
new String[] {
new String(concreteMethod.readableName()),
new String(abstractMethods[0].declaringClass.readableName())},
new String[] {
new String(concreteMethod.readableName()),
new String(abstractMethods[0].declaringClass.shortReadableName())},
type.sourceStart(),
type.sourceEnd());
}
public void staticMemberOfParameterizedType(ASTNode location, ReferenceBinding type) {
if (location == null) { // binary case
this.handle(
IProblem.StaticMemberOfParameterizedType,
new String[] {new String(type.readableName()), new String(type.enclosingType().readableName()), },
new String[] {new String(type.shortReadableName()), new String(type.enclosingType().shortReadableName()), },
AbortCompilation | Error,
0,
1);
return;
}
this.handle(
IProblem.StaticMemberOfParameterizedType,
new String[] {new String(type.readableName()), new String(type.enclosingType().readableName()), },
new String[] {new String(type.shortReadableName()), new String(type.enclosingType().shortReadableName()), },
location.sourceStart,
location.sourceEnd);
}
public void stringConstantIsExceedingUtf8Limit(ASTNode location) {
this.handle(
IProblem.StringConstantIsExceedingUtf8Limit,
NoArgument,
NoArgument,
location.sourceStart,
location.sourceEnd);
}
public void superclassMustBeAClass(SourceTypeBinding type, TypeReference superclassRef, ReferenceBinding superType) {
this.handle(
IProblem.SuperclassMustBeAClass,
new String[] {new String(superType.readableName()), new String(type.sourceName())},
new String[] {new String(superType.shortReadableName()), new String(type.sourceName())},
superclassRef.sourceStart,
superclassRef.sourceEnd);
}
public void superfluousSemicolon(int sourceStart, int sourceEnd) {
this.handle(
IProblem.SuperfluousSemicolon,
NoArgument,
NoArgument,
sourceStart,
sourceEnd);
}
public void superinterfaceMustBeAnInterface(SourceTypeBinding type, TypeReference superInterfaceRef, ReferenceBinding superType) {
this.handle(
IProblem.SuperInterfaceMustBeAnInterface,
new String[] {new String(superType.readableName()), new String(type.sourceName())},
new String[] {new String(superType.shortReadableName()), new String(type.sourceName())},
superInterfaceRef.sourceStart,
superInterfaceRef.sourceEnd);
}
public void superinterfacesCollide(ReferenceBinding type, TypeDeclaration typeDecl, ReferenceBinding superType, ReferenceBinding inheritedSuperType) {
this.handle(
IProblem.SuperInterfacesCollide,
new String[] {new String(superType.readableName()), new String(inheritedSuperType.readableName()), new String(type.sourceName())},
new String[] {new String(superType.shortReadableName()), new String(inheritedSuperType.shortReadableName()), new String(type.sourceName())},
typeDecl.sourceStart,
typeDecl.sourceEnd);
}
public void superTypeCannotUseWildcard(SourceTypeBinding type, TypeReference superclass, TypeBinding superTypeBinding) {
String name = new String(type.sourceName());
String superTypeFullName = new String(superTypeBinding.readableName());
String superTypeShortName = new String(superTypeBinding.shortReadableName());
if (superTypeShortName.equals(name)) superTypeShortName = superTypeFullName;
this.handle(
IProblem.SuperTypeUsingWildcard,
new String[] {superTypeFullName, name},
new String[] {superTypeShortName, name},
superclass.sourceStart,
superclass.sourceEnd);
}
private void syntaxError(
int id,
int startPosition,
int endPosition,
int currentKind,
char[] currentTokenSource,
String errorTokenName,
String expectedToken) {
String eTokenName;
if (isKeyword(currentKind) ||
isLiteral(currentKind) ||
isIdentifier(currentKind)) { //$NON-NLS-1$
eTokenName = new String(currentTokenSource);
} else {
eTokenName = errorTokenName;
}
String[] arguments;
if(expectedToken != null) {
arguments = new String[] {eTokenName, expectedToken};
} else {
arguments = new String[] {eTokenName};
}
this.handle(
id,
arguments,
arguments,
startPosition,
endPosition);
}
public void task(String tag, String message, String priority, int start, int end){
this.handle(
IProblem.Task,
new String[] { tag, message, priority/*secret argument that is not surfaced in getMessage()*/},
new String[] { tag, message, priority/*secret argument that is not surfaced in getMessage()*/},
start,
end);
}
public void tooManyDimensions(ASTNode expression) {
this.handle(
IProblem.TooManyArrayDimensions,
NoArgument,
NoArgument,
expression.sourceStart,
expression.sourceEnd);
}
public void tooManyFields(TypeDeclaration typeDeclaration) {
this.handle(
IProblem.TooManyFields,
new String[]{ new String(typeDeclaration.binding.readableName())},
new String[]{ new String(typeDeclaration.binding.shortReadableName())},
Abort | Error,
typeDeclaration.sourceStart,
typeDeclaration.sourceEnd);
}
public void tooManyMethods(TypeDeclaration typeDeclaration) {
this.handle(
IProblem.TooManyMethods,
new String[]{ new String(typeDeclaration.binding.readableName())},
new String[]{ new String(typeDeclaration.binding.shortReadableName())},
Abort | Error,
typeDeclaration.sourceStart,
typeDeclaration.sourceEnd);
}
public void typeCastError(CastExpression expression, TypeBinding leftType, TypeBinding rightType) {
String leftName = new String(leftType.readableName());
String rightName = new String(rightType.readableName());
String leftShortName = new String(leftType.shortReadableName());
String rightShortName = new String(rightType.shortReadableName());
if (leftShortName.equals(rightShortName)){
leftShortName = leftName;
rightShortName = rightName;
}
this.handle(
IProblem.IllegalCast,
new String[] { rightName, leftName },
new String[] { rightShortName, leftShortName },
expression.sourceStart,
expression.sourceEnd);
}
public void typeCollidesWithPackage(CompilationUnitDeclaration compUnitDecl, TypeDeclaration typeDecl) {
this.referenceContext = typeDecl; // report the problem against the type not the entire compilation unit
String[] arguments = new String[] {new String(compUnitDecl.getFileName()), new String(typeDecl.name)};
this.handle(
IProblem.TypeCollidesWithPackage,
arguments,
arguments,
typeDecl.sourceStart,
typeDecl.sourceEnd,
compUnitDecl.compilationResult);
}
public void typeMismatchError(TypeBinding actualType, TypeBinding expectedType, ASTNode location) {
this.handle(
IProblem.TypeMismatch,
new String[] {new String(actualType.readableName()), new String(expectedType.readableName())},
new String[] {new String(actualType.shortReadableName()), new String(expectedType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void typeMismatchError(TypeBinding typeArgument, TypeVariableBinding typeParameter, ReferenceBinding genericType, ASTNode location) {
if (location == null) { // binary case
this.handle(
IProblem.TypeArgumentMismatch,
new String[] { new String(typeArgument.readableName()), new String(genericType.readableName()), new String(typeParameter.sourceName), parameterBoundAsString(typeParameter, false) },
new String[] { new String(typeArgument.shortReadableName()), new String(genericType.shortReadableName()), new String(typeParameter.sourceName), parameterBoundAsString(typeParameter, true) },
AbortCompilation | Error,
0,
1);
return;
}
this.handle(
IProblem.TypeArgumentMismatch,
new String[] { new String(typeArgument.readableName()), new String(genericType.readableName()), new String(typeParameter.sourceName), parameterBoundAsString(typeParameter, false) },
new String[] { new String(typeArgument.shortReadableName()), new String(genericType.shortReadableName()), new String(typeParameter.sourceName), parameterBoundAsString(typeParameter, true) },
location.sourceStart,
location.sourceEnd);
}
public void undefinedLabel(BranchStatement statement) {
String[] arguments = new String[] {new String(statement.label)};
this.handle(
IProblem.UndefinedLabel,
arguments,
arguments,
statement.sourceStart,
statement.sourceEnd);
}
// can only occur inside binaries
public void undefinedTypeVariableSignature(char[] variableName, ReferenceBinding binaryType) {
this.handle(
IProblem.UndefinedTypeVariable,
new String[] {new String(variableName), new String(binaryType.readableName()) },
new String[] {new String(variableName), new String(binaryType.shortReadableName())},
AbortCompilation | Error,
0,
1);
}
public void undocumentedEmptyBlock(int blockStart, int blockEnd) {
this.handle(
IProblem.UndocumentedEmptyBlock,
NoArgument,
NoArgument,
blockStart,
blockEnd);
}
public void unexpectedStaticModifierForField(SourceTypeBinding type, FieldDeclaration fieldDecl) {
String[] arguments = new String[] {new String(fieldDecl.name)};
this.handle(
IProblem.UnexpectedStaticModifierForField,
arguments,
arguments,
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void unexpectedStaticModifierForMethod(ReferenceBinding type, AbstractMethodDeclaration methodDecl) {
String[] arguments = new String[] {new String(type.sourceName()), new String(methodDecl.selector)};
this.handle(
IProblem.UnexpectedStaticModifierForMethod,
arguments,
arguments,
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void unhandledException(TypeBinding exceptionType, ASTNode location) {
boolean insideDefaultConstructor =
(this.referenceContext instanceof ConstructorDeclaration)
&& ((ConstructorDeclaration)this.referenceContext).isDefaultConstructor();
boolean insideImplicitConstructorCall =
(location instanceof ExplicitConstructorCall)
&& (((ExplicitConstructorCall) location).accessMode == ExplicitConstructorCall.ImplicitSuper);
this.handle(
insideDefaultConstructor
? IProblem.UnhandledExceptionInDefaultConstructor
: (insideImplicitConstructorCall
? IProblem.UndefinedConstructorInImplicitConstructorCall
: IProblem.UnhandledException),
new String[] {new String(exceptionType.readableName())},
new String[] {new String(exceptionType.shortReadableName())},
location.sourceStart,
location.sourceEnd);
}
public void uninitializedBlankFinalField(FieldBinding binding, ASTNode location) {
String[] arguments = new String[] {new String(binding.readableName())};
this.handle(
IProblem.UninitializedBlankFinalField,
arguments,
arguments,
location.sourceStart,
fieldLocation(binding, location));
}
public void uninitializedLocalVariable(LocalVariableBinding binding, ASTNode location) {
String[] arguments = new String[] {new String(binding.readableName())};
this.handle(
IProblem.UninitializedLocalVariable,
arguments,
arguments,
location.sourceStart,
location.sourceEnd);
}
public void unmatchedBracket(int position, ReferenceContext context, CompilationResult compilationResult) {
this.handle(
IProblem.UnmatchedBracket,
NoArgument,
NoArgument,
position,
position,
context,
compilationResult);
}
public void unnecessaryCast(CastExpression castExpression) {
TypeBinding castedExpressionType = castExpression.expression.resolvedType;
this.handle(
IProblem.UnnecessaryCast,
new String[]{ new String(castedExpressionType.readableName()), new String(castExpression.resolvedType.readableName())},
new String[]{ new String(castedExpressionType.shortReadableName()), new String(castExpression.resolvedType.shortReadableName())},
castExpression.sourceStart,
castExpression.sourceEnd);
}
public void unnecessaryCastForArgument(CastExpression castExpression, TypeBinding parameterType) {
TypeBinding castedExpressionType = castExpression.expression.resolvedType;
this.handle(
IProblem.UnnecessaryArgumentCast,
new String[]{ new String(castedExpressionType.readableName()), new String(castExpression.resolvedType.readableName()), new String(parameterType.readableName())},
new String[]{ new String(castedExpressionType.shortReadableName()), new String(castExpression.resolvedType.shortReadableName()), new String(parameterType.shortReadableName())},
castExpression.sourceStart,
castExpression.sourceEnd);
}
public void unnecessaryElse(ASTNode location) {
this.handle(
IProblem.UnnecessaryElse,
NoArgument,
NoArgument,
location.sourceStart,
location.sourceEnd);
}
public void unnecessaryEnclosingInstanceSpecification(Expression expression, ReferenceBinding targetType) {
this.handle(
IProblem.IllegalEnclosingInstanceSpecification,
new String[]{ new String(targetType.readableName())},
new String[]{ new String(targetType.shortReadableName())},
expression.sourceStart,
expression.sourceEnd);
}
public void unnecessaryInstanceof(InstanceOfExpression instanceofExpression, TypeBinding checkType) {
TypeBinding expressionType = instanceofExpression.expression.resolvedType;
this.handle(
IProblem.UnnecessaryInstanceof,
new String[]{ new String(expressionType.readableName()), new String(checkType.readableName())},
new String[]{ new String(expressionType.shortReadableName()), new String(checkType.shortReadableName())},
instanceofExpression.sourceStart,
instanceofExpression.sourceEnd);
}
public void unqualifiedFieldAccess(NameReference reference, FieldBinding field) {
int end = reference.sourceEnd;
if (reference instanceof QualifiedNameReference) {
QualifiedNameReference qref = (QualifiedNameReference) reference;
end = (int) qref.sourcePositions[0];
}
this.handle(
IProblem.UnqualifiedFieldAccess,
new String[] {new String(field.declaringClass.readableName()), new String(field.name)},
new String[] {new String(field.declaringClass.shortReadableName()), new String(field.name)},
reference.sourceStart,
end);
}
public void unreachableCatchBlock(ReferenceBinding exceptionType, ASTNode location) {
this.handle(
IProblem.UnreachableCatch,
new String[] {
new String(exceptionType.readableName()),
},
new String[] {
new String(exceptionType.shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
}
public void unreachableCode(Statement statement) {
this.handle(
IProblem.CodeCannotBeReached,
NoArgument,
NoArgument,
statement.sourceStart,
statement.sourceEnd);
}
public void unresolvableReference(NameReference nameRef, Binding binding) {
int severity = Error;
/* also need to check that the searchedType is the receiver type
if (binding instanceof ProblemBinding) {
ProblemBinding problem = (ProblemBinding) binding;
if (problem.searchType != null && problem.searchType.isHierarchyInconsistent())
severity = SecondaryError;
}
*/
String[] arguments = new String[] {new String(binding.readableName())};
int end = nameRef.sourceEnd;
if (nameRef instanceof QualifiedNameReference) {
QualifiedNameReference ref = (QualifiedNameReference) nameRef;
if (ref.indexOfFirstFieldBinding >= 1)
end = (int) ref.sourcePositions[ref.indexOfFirstFieldBinding - 1];
}
this.handle(
IProblem.UndefinedName,
arguments,
arguments,
severity,
nameRef.sourceStart,
end);
}
public void unsafeCast(CastExpression castExpression) {
TypeBinding castedExpressionType = castExpression.expression.resolvedType;
this.handle(
IProblem.UnsafeGenericCast,
new String[]{ new String(castedExpressionType.readableName()), new String(castExpression.resolvedType.readableName())},
new String[]{ new String(castedExpressionType.shortReadableName()), new String(castExpression.resolvedType.shortReadableName())},
castExpression.sourceStart,
castExpression.sourceEnd);
}
public void unsafeRawConversion(Expression expression, TypeBinding expressionType, TypeBinding expectedType) {
this.handle(
IProblem.UnsafeRawConversion,
new String[] { new String(expressionType.readableName()), new String(expectedType.readableName()), new String(expectedType.erasure().readableName()) },
new String[] { new String(expressionType.shortReadableName()), new String(expectedType.shortReadableName()), new String(expectedType.erasure().shortReadableName()) },
expression.sourceStart,
expression.sourceEnd);
}
public void unsafeRawFieldAssignment(FieldBinding rawField, TypeBinding expressionType, ASTNode location) {
this.handle(
IProblem.UnsafeRawFieldAssignment,
new String[] {
new String(expressionType.readableName()), new String(rawField.name), new String(rawField.declaringClass.readableName()), new String(rawField.declaringClass.erasure().readableName()) },
new String[] {
new String(expressionType.shortReadableName()), new String(rawField.name), new String(rawField.declaringClass.shortReadableName()), new String(rawField.declaringClass.erasure().shortReadableName()) },
location.sourceStart,
location.sourceEnd);
}
public void unsafeRawInvocation(ASTNode location, TypeBinding receiverType, MethodBinding method) {
if (method.isConstructor()) {
this.handle(
IProblem.UnsafeRawConstructorInvocation,
new String[] {
new String(receiverType.readableName()),
parametersAsString(method.original().parameters, false),
new String(receiverType.erasure().readableName()),
},
new String[] {
new String(receiverType.shortReadableName()),
parametersAsString(method.original().parameters, true),
new String(receiverType.erasure().shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
} else {
this.handle(
IProblem.UnsafeRawMethodInvocation,
new String[] {
new String(method.selector),
parametersAsString(method.original().parameters, false),
new String(receiverType.readableName()),
new String(receiverType.erasure().readableName()),
},
new String[] {
new String(method.selector),
parametersAsString(method.original().parameters, true),
new String(receiverType.shortReadableName()),
new String(receiverType.erasure().shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
}
}
public void unsafeReturnTypeOverride(MethodBinding currentMethod, MethodBinding inheritedMethod, ASTNode location) {
this.handle(
IProblem.UnsafeReturnTypeOverride,
new String[] {
new String(currentMethod.returnType.readableName()),
new String(currentMethod.selector),
parametersAsString(currentMethod.original().parameters, false),
new String(currentMethod.declaringClass.readableName()),
new String(inheritedMethod.returnType.readableName()),
//new String(inheritedMethod.returnType.erasure().readableName()),
},
new String[] {
new String(currentMethod.returnType.shortReadableName()),
new String(currentMethod.selector),
parametersAsString(currentMethod.original().parameters, true),
new String(currentMethod.declaringClass.shortReadableName()),
new String(inheritedMethod.returnType.shortReadableName()),
//new String(inheritedMethod.returnType.erasure().shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
}
public void unusedArgument(LocalDeclaration localDecl) {
String[] arguments = new String[] {new String(localDecl.name)};
this.handle(
IProblem.ArgumentIsNeverUsed,
arguments,
arguments,
localDecl.sourceStart,
localDecl.sourceEnd);
}
public void unusedDeclaredThrownException(ReferenceBinding exceptionType, AbstractMethodDeclaration method, ASTNode location) {
if (method.isConstructor()) {
this.handle(
IProblem.UnusedConstructorDeclaredThrownException,
new String[] {
new String(method.binding.declaringClass.readableName()),
parametersAsString(method.binding.parameters, false),
new String(exceptionType.readableName()),
},
new String[] {
new String(method.binding.declaringClass.shortReadableName()),
parametersAsString(method.binding.parameters, true),
new String(exceptionType.shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
} else {
this.handle(
IProblem.UnusedMethodDeclaredThrownException,
new String[] {
new String(method.binding.declaringClass.readableName()),
new String(method.selector),
parametersAsString(method.binding.parameters, false),
new String(exceptionType.readableName()),
},
new String[] {
new String(method.binding.declaringClass.shortReadableName()),
new String(method.selector),
parametersAsString(method.binding.parameters, true),
new String(exceptionType.shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
}
}
public void unusedImport(ImportReference importRef) {
String[] arguments = new String[] { CharOperation.toString(importRef.tokens) };
this.handle(
IProblem.UnusedImport,
arguments,
arguments,
importRef.sourceStart,
importRef.sourceEnd);
}
public void unusedLocalVariable(LocalDeclaration localDecl) {
String[] arguments = new String[] {new String(localDecl.name)};
this.handle(
IProblem.LocalVariableIsNeverUsed,
arguments,
arguments,
localDecl.sourceStart,
localDecl.sourceEnd);
}
public void unusedPrivateConstructor(ConstructorDeclaration constructorDecl) {
if (computeSeverity(IProblem.UnusedPrivateConstructor) == Ignore) return;
// no complaint for no-arg constructors (or default ones) - known pattern to block instantiation
if (constructorDecl.arguments == null || constructorDecl.arguments.length == 0) return;
MethodBinding constructor = constructorDecl.binding;
this.handle(
IProblem.UnusedPrivateConstructor,
new String[] {
new String(constructor.declaringClass.readableName()),
parametersAsString(constructor.parameters, false)
},
new String[] {
new String(constructor.declaringClass.shortReadableName()),
parametersAsString(constructor.parameters, true)
},
constructorDecl.sourceStart,
constructorDecl.sourceEnd);
}
public void unusedPrivateField(FieldDeclaration fieldDecl) {
if (computeSeverity(IProblem.UnusedPrivateField) == Ignore) return;
FieldBinding field = fieldDecl.binding;
if (CharOperation.equals(TypeConstants.SERIALVERSIONUID, field.name)
&& field.isStatic()
&& field.isFinal()
&& BaseTypes.LongBinding == field.type) {
return; // do not report unused serialVersionUID field
}
if (CharOperation.equals(TypeConstants.SERIALPERSISTENTFIELDS, field.name)
&& field.isStatic()
&& field.isFinal()
&& field.type.dimensions() == 1
&& CharOperation.equals(TypeConstants.CharArray_JAVA_IO_OBJECTSTREAMFIELD, field.type.leafComponentType().readableName())) {
return; // do not report unused serialPersistentFields field
}
this.handle(
IProblem.UnusedPrivateField,
new String[] {
new String(field.declaringClass.readableName()),
new String(field.name),
},
new String[] {
new String(field.declaringClass.shortReadableName()),
new String(field.name),
},
fieldDecl.sourceStart,
fieldDecl.sourceEnd);
}
public void unusedPrivateMethod(AbstractMethodDeclaration methodDecl) {
if (computeSeverity(IProblem.UnusedPrivateMethod) == Ignore) return;
MethodBinding method = methodDecl.binding;
// no report for serialization support 'void readObject(ObjectInputStream)'
if (!method.isStatic()
&& BaseTypes.VoidBinding == method.returnType
&& method.parameters.length == 1
&& method.parameters[0].dimensions() == 0
&& CharOperation.equals(method.selector, TypeConstants.READOBJECT)
&& CharOperation.equals(TypeConstants.CharArray_JAVA_IO_OBJECTINPUTSTREAM, method.parameters[0].readableName())) {
return;
}
// no report for serialization support 'void writeObject(ObjectOutputStream)'
if (!method.isStatic()
&& BaseTypes.VoidBinding == method.returnType
&& method.parameters.length == 1
&& method.parameters[0].dimensions() == 0
&& CharOperation.equals(method.selector, TypeConstants.WRITEOBJECT)
&& CharOperation.equals(TypeConstants.CharArray_JAVA_IO_OBJECTOUTPUTSTREAM, method.parameters[0].readableName())) {
return;
}
// no report for serialization support 'Object readResolve()'
if (!method.isStatic()
&& TypeIds.T_Object == method.returnType.id
&& method.parameters.length == 0
&& CharOperation.equals(method.selector, TypeConstants.READRESOLVE)) {
return;
}
// no report for serialization support 'Object writeReplace()'
if (!method.isStatic()
&& TypeIds.T_Object == method.returnType.id
&& method.parameters.length == 0
&& CharOperation.equals(method.selector, TypeConstants.WRITEREPLACE)) {
return;
}
this.handle(
IProblem.UnusedPrivateMethod,
new String[] {
new String(method.declaringClass.readableName()),
new String(method.selector),
parametersAsString(method.parameters, false)
},
new String[] {
new String(method.declaringClass.shortReadableName()),
new String(method.selector),
parametersAsString(method.parameters, true)
},
methodDecl.sourceStart,
methodDecl.sourceEnd);
}
public void unusedPrivateType(TypeDeclaration typeDecl) {
if (computeSeverity(IProblem.UnusedPrivateType) == Ignore) return;
ReferenceBinding type = typeDecl.binding;
this.handle(
IProblem.UnusedPrivateType,
new String[] {
new String(type.readableName()),
},
new String[] {
new String(type.shortReadableName()),
},
typeDecl.sourceStart,
typeDecl.sourceEnd);
}
public void useAssertAsAnIdentifier(int sourceStart, int sourceEnd) {
this.handle(
IProblem.UseAssertAsAnIdentifier,
NoArgument,
NoArgument,
sourceStart,
sourceEnd);
}
public void useEnumAsAnIdentifier(int sourceStart, int sourceEnd) {
this.handle(
IProblem.UseEnumAsAnIdentifier,
NoArgument,
NoArgument,
sourceStart,
sourceEnd);
}
public void variableTypeCannotBeVoid(AbstractVariableDeclaration varDecl) {
String[] arguments = new String[] {new String(varDecl.name)};
this.handle(
IProblem.VariableTypeCannotBeVoid,
arguments,
arguments,
varDecl.sourceStart,
varDecl.sourceEnd);
}
public void variableTypeCannotBeVoidArray(AbstractVariableDeclaration varDecl) {
String[] arguments = new String[] {new String(varDecl.name)};
this.handle(
IProblem.VariableTypeCannotBeVoidArray,
arguments,
arguments,
varDecl.sourceStart,
varDecl.sourceEnd);
}
public void visibilityConflict(MethodBinding currentMethod, MethodBinding inheritedMethod) {
this.handle(
// Cannot reduce the visibility of the inherited method from %1
// 8.4.6.3 - The access modifier of an hiding method must provide at least as much access as the hidden method.
// 8.4.6.3 - The access modifier of an overiding method must provide at least as much access as the overriden method.
IProblem.MethodReducesVisibility,
new String[] {new String(inheritedMethod.declaringClass.readableName())},
new String[] {new String(inheritedMethod.declaringClass.shortReadableName())},
currentMethod.sourceStart(),
currentMethod.sourceEnd());
}
public void wildcardAssignment(TypeBinding variableType, TypeBinding expressionType, ASTNode location) {
this.handle(
IProblem.WildcardFieldAssignment,
new String[] {
new String(expressionType.readableName()), new String(variableType.readableName()) },
new String[] {
new String(expressionType.shortReadableName()), new String(variableType.shortReadableName()) },
location.sourceStart,
location.sourceEnd);
}
public void wildcardInvocation(ASTNode location, TypeBinding receiverType, MethodBinding method, TypeBinding[] arguments) {
TypeBinding offendingArgument = null;
TypeBinding offendingParameter = null;
for (int i = 0, length = method.parameters.length; i < length; i++) {
TypeBinding parameter = method.parameters[i];
if (parameter.isWildcard() && (((WildcardBinding) parameter).kind != Wildcard.SUPER)) {
offendingParameter = parameter;
offendingArgument = arguments[i];
break;
}
}
if (method.isConstructor()) {
this.handle(
IProblem.WildcardConstructorInvocation,
new String[] {
new String(receiverType.sourceName()),
parametersAsString(method.parameters, false),
new String(receiverType.readableName()),
parametersAsString(arguments, false),
new String(offendingArgument.readableName()),
new String(offendingParameter.readableName()),
},
new String[] {
new String(receiverType.sourceName()),
parametersAsString(method.parameters, true),
new String(receiverType.shortReadableName()),
parametersAsString(arguments, true),
new String(offendingArgument.shortReadableName()),
new String(offendingParameter.shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
} else {
this.handle(
IProblem.WildcardMethodInvocation,
new String[] {
new String(method.selector),
parametersAsString(method.parameters, false),
new String(receiverType.readableName()),
parametersAsString(arguments, false),
new String(offendingArgument.readableName()),
new String(offendingParameter.readableName()),
},
new String[] {
new String(method.selector),
parametersAsString(method.parameters, true),
new String(receiverType.shortReadableName()),
parametersAsString(arguments, true),
new String(offendingArgument.shortReadableName()),
new String(offendingParameter.shortReadableName()),
},
location.sourceStart,
location.sourceEnd);
}
}
public void wrongSequenceOfExceptionTypesError(TryStatement statement, TypeBinding exceptionType, int under, TypeBinding hidingExceptionType) {
//the two catch block under and upper are in an incorrect order.
//under should be define BEFORE upper in the source
TypeReference typeRef = statement.catchArguments[under].type;
this.handle(
IProblem.InvalidCatchBlockSequence,
new String[] {
new String(exceptionType.readableName()),
new String(hidingExceptionType.readableName()),
},
new String[] {
new String(exceptionType.shortReadableName()),
new String(hidingExceptionType.shortReadableName()),
},
typeRef.sourceStart,
typeRef.sourceEnd);
}
}