X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/ExplicitConstructorCall.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/ExplicitConstructorCall.java index deeceb9..acd983f 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/ExplicitConstructorCall.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/ExplicitConstructorCall.java @@ -1,19 +1,27 @@ /******************************************************************************* - * 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 @@ -71,8 +79,8 @@ public class ExplicitConstructorCall flowContext.checkExceptionHandlers( thrownExceptions, (accessMode == ImplicitSuper) - ? (AstNode) currentScope.methodScope().referenceContext - : (AstNode) this, + ? (ASTNode) currentScope.methodScope().referenceContext + : (ASTNode) this, flowInfo, currentScope); } @@ -87,52 +95,60 @@ public class ExplicitConstructorCall /** * 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(); @@ -165,16 +181,10 @@ public class ExplicitConstructorCall && 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); } } } @@ -184,17 +194,17 @@ public class ExplicitConstructorCall // 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); - } +// } } } @@ -257,6 +267,9 @@ public class ExplicitConstructorCall 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; @@ -278,7 +291,23 @@ public class ExplicitConstructorCall 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); @@ -299,7 +328,7 @@ public class ExplicitConstructorCall return s; } - public void traverse(IAbstractSyntaxTreeVisitor visitor, BlockScope scope) { + public void traverse(ASTVisitor visitor, BlockScope scope) { if (visitor.visit(this, scope)) { if (qualification != null) { @@ -313,4 +342,4 @@ public class ExplicitConstructorCall } visitor.endVisit(this, scope); } -} \ No newline at end of file +}