import net.sourceforge.phpdt.internal.compiler.lookup.TypeBinding;
import net.sourceforge.phpdt.internal.compiler.lookup.VariableBinding;
-public class ExplicitConstructorCall
- extends Statement
- implements InvocationSite {
-
+public class ExplicitConstructorCall extends Statement implements
+ InvocationSite {
+
public Expression[] arguments;
+
public Expression qualification;
+
public MethodBinding binding;
public int accessMode;
public final static int ImplicitSuper = 1;
+
public final static int Super = 2;
+
public final static int This = 3;
public VariableBinding[][] implicitArguments;
+
boolean discardEnclosingInstance;
MethodBinding syntheticAccessor;
this.accessMode = accessMode;
}
- public FlowInfo analyseCode(
- BlockScope currentScope,
- FlowContext flowContext,
- FlowInfo flowInfo) {
+ public FlowInfo analyseCode(BlockScope currentScope,
+ FlowContext flowContext, FlowInfo flowInfo) {
- // must verify that exceptions potentially thrown by this expression are caught in the method.
+ // must verify that exceptions potentially thrown by this expression are
+ // caught in the method.
try {
((MethodScope) currentScope).isConstructorCall = true;
// process enclosing instance
if (qualification != null) {
- flowInfo =
- qualification
- .analyseCode(currentScope, flowContext, flowInfo)
- .unconditionalInits();
+ flowInfo = qualification.analyseCode(currentScope, flowContext,
+ flowInfo).unconditionalInits();
}
// process arguments
if (arguments != null) {
for (int i = 0, max = arguments.length; i < max; i++) {
- flowInfo =
- arguments[i]
- .analyseCode(currentScope, flowContext, flowInfo)
- .unconditionalInits();
+ flowInfo = arguments[i].analyseCode(currentScope,
+ flowContext, flowInfo).unconditionalInits();
}
}
ReferenceBinding[] thrownExceptions;
if ((thrownExceptions = binding.thrownExceptions) != NoExceptions) {
// check exceptions
- flowContext.checkExceptionHandlers(
- thrownExceptions,
- (accessMode == ImplicitSuper)
- ? (ASTNode) currentScope.methodScope().referenceContext
- : (ASTNode) this,
- flowInfo,
- currentScope);
+ flowContext.checkExceptionHandlers(thrownExceptions,
+ (accessMode == ImplicitSuper) ? (ASTNode) currentScope
+ .methodScope().referenceContext
+ : (ASTNode) this, flowInfo, currentScope);
}
manageEnclosingInstanceAccessIfNecessary(currentScope);
manageSyntheticAccessIfNecessary(currentScope);
/**
* Constructor call code generation
- *
- * @param currentScope net.sourceforge.phpdt.internal.compiler.lookup.BlockScope
- * @param codeStream net.sourceforge.phpdt.internal.compiler.codegen.CodeStream
+ *
+ * @param currentScope
+ * net.sourceforge.phpdt.internal.compiler.lookup.BlockScope
+ * @param codeStream
+ * net.sourceforge.phpdt.internal.compiler.codegen.CodeStream
*/
-// public void generateCode(BlockScope currentScope, CodeStream codeStream) {
-//
-// if ((bits & IsReachableMASK) == 0) {
-// return;
-// }
-// try {
-// ((MethodScope) currentScope).isConstructorCall = true;
-//
-// int pc = codeStream.position;
-// codeStream.aload_0();
-//
-// // handling innerclass constructor invocation
-// ReferenceBinding targetType = binding.declaringClass;
-// // handling innerclass instance allocation - enclosing instance arguments
-// if (targetType.isNestedType()) {
-// codeStream.generateSyntheticEnclosingInstanceValues(
-// currentScope,
-// targetType,
-// discardEnclosingInstance ? null : qualification,
-// this);
-// }
-// // regular code gen
-// if (arguments != null) {
-// for (int i = 0, max = arguments.length; i < max; i++) {
-// arguments[i].generateCode(currentScope, codeStream, true);
-// }
-// }
-// // handling innerclass instance allocation - outer local arguments
-// if (targetType.isNestedType()) {
-// codeStream.generateSyntheticOuterArgumentValues(
-// currentScope,
-// targetType,
-// this);
-// }
-// if (syntheticAccessor != null) {
-// // synthetic accessor got some extra arguments appended to its signature, which need values
-// for (int i = 0,
-// max = syntheticAccessor.parameters.length - binding.parameters.length;
-// i < max;
-// i++) {
-// codeStream.aconst_null();
-// }
-// codeStream.invokespecial(syntheticAccessor);
-// } else {
-// codeStream.invokespecial(binding);
-// }
-// codeStream.recordPositionsFrom(pc, this.sourceStart);
-// } finally {
-// ((MethodScope) currentScope).isConstructorCall = false;
-// }
-// }
-
+ // public void generateCode(BlockScope currentScope, CodeStream codeStream)
+ // {
+ //
+ // if ((bits & IsReachableMASK) == 0) {
+ // return;
+ // }
+ // try {
+ // ((MethodScope) currentScope).isConstructorCall = true;
+ //
+ // int pc = codeStream.position;
+ // codeStream.aload_0();
+ //
+ // // handling innerclass constructor invocation
+ // ReferenceBinding targetType = binding.declaringClass;
+ // // handling innerclass instance allocation - enclosing instance arguments
+ // if (targetType.isNestedType()) {
+ // codeStream.generateSyntheticEnclosingInstanceValues(
+ // currentScope,
+ // targetType,
+ // discardEnclosingInstance ? null : qualification,
+ // this);
+ // }
+ // // regular code gen
+ // if (arguments != null) {
+ // for (int i = 0, max = arguments.length; i < max; i++) {
+ // arguments[i].generateCode(currentScope, codeStream, true);
+ // }
+ // }
+ // // handling innerclass instance allocation - outer local arguments
+ // if (targetType.isNestedType()) {
+ // codeStream.generateSyntheticOuterArgumentValues(
+ // currentScope,
+ // targetType,
+ // this);
+ // }
+ // if (syntheticAccessor != null) {
+ // // synthetic accessor got some extra arguments appended to its signature,
+ // which need values
+ // for (int i = 0,
+ // max = syntheticAccessor.parameters.length - binding.parameters.length;
+ // i < max;
+ // i++) {
+ // codeStream.aconst_null();
+ // }
+ // codeStream.invokespecial(syntheticAccessor);
+ // } else {
+ // codeStream.invokespecial(binding);
+ // }
+ // codeStream.recordPositionsFrom(pc, this.sourceStart);
+ // } finally {
+ // ((MethodScope) currentScope).isConstructorCall = false;
+ // }
+ // }
public boolean isImplicitSuper() {
- //return true if I'm of these compiler added statement super();
+ // return true if I'm of these compiler added statement super();
return (accessMode == ImplicitSuper);
}
return true;
}
- /* Inner emulation consists in either recording a dependency
- * link only, or performing one level of propagation.
- *
- * Dependency mechanism is used whenever dealing with source target
- * types, since by the time we reach them, we might not yet know their
- * exact need.
+ /*
+ * Inner emulation consists in either recording a dependency link only, or
+ * performing one level of propagation.
+ *
+ * Dependency mechanism is used whenever dealing with source target types,
+ * since by the time we reach them, we might not yet know their exact need.
*/
void manageEnclosingInstanceAccessIfNecessary(BlockScope currentScope) {
ReferenceBinding superType;
- // perform some emulation work in case there is some and we are inside a local type only
+ // perform some emulation work in case there is some and we are inside a
+ // local type only
if ((superType = binding.declaringClass).isNestedType()
- && currentScope.enclosingSourceType().isLocalType()) {
+ && currentScope.enclosingSourceType().isLocalType()) {
if (superType.isLocalType()) {
- ((LocalTypeBinding) superType).addInnerEmulationDependent(currentScope, qualification != null);
+ ((LocalTypeBinding) superType).addInnerEmulationDependent(
+ currentScope, qualification != null);
} else {
- // locally propagate, since we already now the desired shape for sure
- currentScope.propagateInnerEmulation(superType, qualification != null);
+ // locally propagate, since we already now the desired shape for
+ // sure
+ currentScope.propagateInnerEmulation(superType,
+ qualification != null);
}
}
}
public void manageSyntheticAccessIfNecessary(BlockScope currentScope) {
- // perform some emulation work in case there is some and we are inside a local type only
+ // perform some emulation work in case there is some and we are inside a
+ // local type only
if (binding.isPrivate() && (accessMode != This)) {
-// if (currentScope
-// .environment()
-// .options
-// .isPrivateConstructorAccessChangingVisibility) {
-// binding.tagForClearingPrivateModifier();
-// // constructor will not be dumped as private, no emulation required thus
-// } else {
- syntheticAccessor =
- ((SourceTypeBinding) binding.declaringClass).addSyntheticMethod(binding, isSuperAccess());
- currentScope.problemReporter().needToEmulateMethodAccess(binding, this);
-// }
+ // if (currentScope
+ // .environment()
+ // .options
+ // .isPrivateConstructorAccessChangingVisibility) {
+ // binding.tagForClearingPrivateModifier();
+ // // constructor will not be dumped as private, no emulation
+ // required thus
+ // } else {
+ syntheticAccessor = ((SourceTypeBinding) binding.declaringClass)
+ .addSyntheticMethod(binding, isSuperAccess());
+ currentScope.problemReporter().needToEmulateMethodAccess(binding,
+ this);
+ // }
}
}
// qualification should be from the type of the enclosingType
if (qualification != null) {
if (accessMode != Super) {
- scope.problemReporter().unnecessaryEnclosingInstanceSpecification(
- qualification,
- receiverType);
+ scope.problemReporter()
+ .unnecessaryEnclosingInstanceSpecification(
+ qualification, receiverType);
}
ReferenceBinding enclosingType = receiverType.enclosingType();
if (enclosingType == null) {
- scope.problemReporter().unnecessaryEnclosingInstanceSpecification(
- qualification,
- receiverType);
+ scope.problemReporter()
+ .unnecessaryEnclosingInstanceSpecification(
+ qualification, receiverType);
discardEnclosingInstance = true;
} else {
- TypeBinding qTb = qualification.resolveTypeExpecting(scope, enclosingType);
+ TypeBinding qTb = qualification.resolveTypeExpecting(scope,
+ enclosingType);
qualification.implicitWidening(qTb, qTb);
}
}
return;
}
if ((binding = scope.getConstructor(receiverType, argTypes, this))
- .isValidBinding()) {
+ .isValidBinding()) {
if (isMethodUseDeprecated(binding, scope))
scope.problemReporter().deprecatedMethod(binding, this);
- // see for user-implicit widening conversion
+ // see for user-implicit widening conversion
if (arguments != null) {
int length = arguments.length;
TypeBinding[] paramTypes = binding.parameters;
for (int i = 0; i < length; i++)
- arguments[i].implicitWidening(paramTypes[i], argTypes[i]);
+ arguments[i].implicitWidening(paramTypes[i],
+ argTypes[i]);
}
if (binding.isPrivate()) {
binding.modifiers |= AccPrivateUsed;
- }
+ }
} else {
if (binding.declaringClass == null)
binding.declaringClass = receiverType;
public void setFieldIndex(int depth) {
// ignore for here
}
+
public StringBuffer printStatement(int indent, StringBuffer output) {
printIndent(indent, output);
- if (qualification != null) qualification.printExpression(0, output).append('.');
+ if (qualification != null)
+ qualification.printExpression(0, output).append('.');
if (accessMode == This) {
output.append("this("); //$NON-NLS-1$
} else {
}
if (arguments != null) {
for (int i = 0; i < arguments.length; i++) {
- if (i > 0) output.append(", "); //$NON-NLS-1$
+ if (i > 0)
+ output.append(", "); //$NON-NLS-1$
arguments[i].printExpression(0, output);
}
}
return output.append(");"); //$NON-NLS-1$
}
+
public String toString(int tab) {
String s = tabString(tab);