Refactored packagename to net.sourceforge.phpdt.internal.compiler.ast
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / ast / ExplicitConstructorCall.java
index deeceb9..acd983f 100644 (file)
@@ -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
+}