/*******************************************************************************
- * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others.
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
+ * 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-v05.html
+ * http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
- ******************************************************************************/
+ *******************************************************************************/
package net.sourceforge.phpdt.internal.compiler.ast;
-import net.sourceforge.phpdt.internal.compiler.IAbstractSyntaxTreeVisitor;
-import net.sourceforge.phpdt.internal.compiler.codegen.*;
-import net.sourceforge.phpdt.internal.compiler.flow.*;
-import net.sourceforge.phpdt.internal.compiler.lookup.*;
+import net.sourceforge.phpdt.internal.compiler.ASTVisitor;
+import net.sourceforge.phpdt.internal.compiler.flow.FlowContext;
+import net.sourceforge.phpdt.internal.compiler.flow.FlowInfo;
+import net.sourceforge.phpdt.internal.compiler.lookup.BlockScope;
+import net.sourceforge.phpdt.internal.compiler.lookup.InvocationSite;
+import net.sourceforge.phpdt.internal.compiler.lookup.LocalTypeBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.MethodBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.MethodScope;
+import net.sourceforge.phpdt.internal.compiler.lookup.ReferenceBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.SourceTypeBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.TypeBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.VariableBinding;
public class ExplicitConstructorCall
extends Statement
flowContext.checkExceptionHandlers(
thrownExceptions,
(accessMode == ImplicitSuper)
- ? (AstNode) currentScope.methodScope().referenceContext
- : (AstNode) this,
+ ? (ASTNode) currentScope.methodScope().referenceContext
+ : (ASTNode) this,
flowInfo,
currentScope);
}
/**
* Constructor call code generation
*
- * @param currentScope org.eclipse.jdt.internal.compiler.lookup.BlockScope
- * @param codeStream org.eclipse.jdt.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;
- if ((targetType = binding.declaringClass).isNestedType()) {
- codeStream.generateSyntheticArgumentValues(
- 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);
- }
- }
- 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();
&& currentScope.enclosingSourceType().isLocalType()) {
if (superType.isLocalType()) {
- ((LocalTypeBinding) superType).addInnerEmulationDependent(
- currentScope,
- qualification != null,
- true);
- // request direct access
+ ((LocalTypeBinding) superType).addInnerEmulationDependent(currentScope, qualification != null);
} else {
// locally propagate, since we already now the desired shape for sure
- currentScope.propagateInnerEmulation(superType, qualification != null, true);
- // request direct access
-
+ currentScope.propagateInnerEmulation(superType, qualification != null);
}
}
}
// 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 {
+// 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);
+ ((SourceTypeBinding) binding.declaringClass).addSyntheticMethod(binding, isSuperAccess());
currentScope.problemReporter().needToEmulateMethodAccess(binding, this);
- }
+// }
}
}
for (int i = 0; i < length; 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 (accessMode == This) {
+ output.append("this("); //$NON-NLS-1$
+ } else {
+ output.append("super("); //$NON-NLS-1$
+ }
+ if (arguments != null) {
+ for (int i = 0; i < arguments.length; i++) {
+ 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);
return s;
}
- public void traverse(IAbstractSyntaxTreeVisitor visitor, BlockScope scope) {
+ public void traverse(ASTVisitor visitor, BlockScope scope) {
if (visitor.visit(this, scope)) {
if (qualification != null) {
}
visitor.endVisit(this, scope);
}
-}
\ No newline at end of file
+}