1) Moved net.sourceforge.phpeclipse.ui\src\net\sourceforge\phpdt back to net.sourcefo...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / ast / FieldDeclaration.java
index b1fa8d0..7268571 100644 (file)
-/*******************************************************************************
- * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v0.5 
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
+/***********************************************************************************************************************************
+ * 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 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
- ******************************************************************************/
+ * 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.impl.*;
-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.impl.Constant;
+import net.sourceforge.phpdt.internal.compiler.lookup.ArrayBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.BaseTypeBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.FieldBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.MethodScope;
+import net.sourceforge.phpdt.internal.compiler.lookup.Scope;
+import net.sourceforge.phpdt.internal.compiler.lookup.SourceTypeBinding;
+import net.sourceforge.phpdt.internal.compiler.lookup.TypeBinding;
 
 public class FieldDeclaration extends AbstractVariableDeclaration {
        public FieldBinding binding;
+
        boolean hasBeenResolved = false;
 
-       //allows to retrieve both the "type" part of the declaration (part1)
-       //and also the part that decribe the name and the init and optionally
-       //some other dimension ! .... 
-       //public int[] a, b[] = X, c ;
-       //for b that would give for 
+       // allows to retrieve both the "type" part of the declaration (part1)
+       // and also the part that decribe the name and the init and optionally
+       // some other dimension ! ....
+       // public int[] a, b[] = X, c ;
+       // for b that would give for
        // - part1 : public int[]
        // - part2 : b[] = X,
 
        public int endPart1Position;
+
        public int endPart2Position;
 
        public FieldDeclaration() {
        }
 
-       public FieldDeclaration(
-               Expression initialization,
-               char[] name,
-               int sourceStart,
-               int sourceEnd) {
+       public FieldDeclaration(char[] name, int sourceStart, int sourceEnd) {
+
+               this.name = name;
+
+               // due to some declaration like
+               // int x, y = 3, z , x ;
+               // the sourceStart and the sourceEnd is ONLY on the name
+               this.sourceStart = sourceStart;
+               this.sourceEnd = sourceEnd;
+       }
+
+       public FieldDeclaration(Expression initialization, char[] name,
+                       int sourceStart, int sourceEnd) {
 
                this.initialization = initialization;
                this.name = name;
 
-               //due to some declaration like 
+               // due to some declaration like
                // int x, y = 3, z , x ;
-               //the sourceStart and the sourceEnd is ONLY on  the name
+               // the sourceStart and the sourceEnd is ONLY on the name
                this.sourceStart = sourceStart;
                this.sourceEnd = sourceEnd;
        }
 
-       public FlowInfo analyseCode(
-               MethodScope initializationScope,
-               FlowContext flowContext,
-               FlowInfo flowInfo) {
+       public FlowInfo analyseCode(MethodScope initializationScope,
+                       FlowContext flowContext, FlowInfo flowInfo) {
 
+               if (this.binding != null && this.binding.isPrivate()
+                               && !this.binding.isPrivateUsed()) {
+                       if (!initializationScope.referenceCompilationUnit().compilationResult
+                                       .hasSyntaxError()) {
+                               initializationScope.problemReporter().unusedPrivateField(this);
+                       }
+               }
                // cannot define static non-constant field inside nested class
-               if (binding != null
-                       && binding.isValidBinding()
-                       && binding.isStatic()
-                       && binding.constant == NotAConstant
-                       && binding.declaringClass.isNestedType()
-                       && binding.declaringClass.isClass()
-                       && !binding.declaringClass.isStatic()) {
-                       initializationScope.problemReporter().unexpectedStaticModifierForField(
-                               (SourceTypeBinding) binding.declaringClass,
-                               this);
+               if (binding != null && binding.isValidBinding() && binding.isStatic()
+                               && binding.constant == NotAConstant
+                               && binding.declaringClass.isNestedType()
+                               && binding.declaringClass.isClass()
+                               && !binding.declaringClass.isStatic()) {
+                       initializationScope.problemReporter()
+                                       .unexpectedStaticModifierForField(
+                                                       (SourceTypeBinding) binding.declaringClass, this);
                }
 
                if (initialization != null) {
-                       flowInfo =
-                               initialization
-                                       .analyseCode(initializationScope, flowContext, flowInfo)
-                                       .unconditionalInits();
+                       flowInfo = initialization.analyseCode(initializationScope,
+                                       flowContext, flowInfo).unconditionalInits();
                        flowInfo.markAsDefinitelyAssigned(binding);
-               } else {
-                       flowInfo.markAsDefinitelyNotAssigned(binding);
-                       // clear the bit in case it was already set (from enclosing info)
                }
                return flowInfo;
        }
 
        /**
-        * Code generation for a field declaration:
-        *      i.e. normal assignment to a field 
-        *
-        * @param currentScope org.eclipse.jdt.internal.compiler.lookup.BlockScope
-        * @param codeStream org.eclipse.jdt.internal.compiler.codegen.CodeStream
+        * Code generation for a field declaration: standard assignment to a field
+        * 
+        * @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;
-               }
-               // do not generate initialization code if final and static (constant is then
-               // recorded inside the field itself).
-               int pc = codeStream.position;
-               boolean isStatic;
-               if (initialization != null
-                       && !((isStatic = binding.isStatic()) && binding.constant != NotAConstant)) {
-                       // non-static field, need receiver
-                       if (!isStatic)
-                               codeStream.aload_0();
-                       // generate initialization value
-                       initialization.generateCode(currentScope, codeStream, true);
-                       // store into field
-                       if (isStatic) {
-                               codeStream.putstatic(binding);
-                       } else {
-                               codeStream.putfield(binding);
-                       }
-               }
-               codeStream.recordPositionsFrom(pc, this.sourceStart);
-       }
-
+       // public void generateCode(BlockScope currentScope, CodeStream codeStream)
+       // {
+       //
+       // if ((bits & IsReachableMASK) == 0) {
+       // return;
+       // }
+       // // do not generate initialization code if final and static (constant is
+       // then
+       // // recorded inside the field itself).
+       // int pc = codeStream.position;
+       // boolean isStatic;
+       // if (initialization != null
+       // && !((isStatic = binding.isStatic()) && binding.constant !=
+       // NotAConstant)) {
+       // // non-static field, need receiver
+       // if (!isStatic)
+       // codeStream.aload_0();
+       // // generate initialization value
+       // initialization.generateCode(currentScope, codeStream, true);
+       // // store into field
+       // if (isStatic) {
+       // codeStream.putstatic(binding);
+       // } else {
+       // codeStream.putfield(binding);
+       // }
+       // }
+       // codeStream.recordPositionsFrom(pc, this.sourceStart);
+       // }
        public TypeBinding getTypeBinding(Scope scope) {
 
                return type.getTypeBinding(scope);
@@ -139,18 +153,22 @@ public class FieldDeclaration extends AbstractVariableDeclaration {
        public void resolve(MethodScope initializationScope) {
 
                // the two <constant = Constant.NotAConstant> could be regrouped into
-               // a single line but it is clearer to have two lines while the reason of their
+               // a single line but it is clearer to have two lines while the reason of
+               // their
                // existence is not at all the same. See comment for the second one.
 
-               //--------------------------------------------------------
-               if (!this.hasBeenResolved && binding != null && this.binding.isValidBinding()) {
+               // --------------------------------------------------------
+               if (!this.hasBeenResolved && binding != null
+                               && this.binding.isValidBinding()) {
 
                        this.hasBeenResolved = true;
 
                        if (isTypeUseDeprecated(this.binding.type, initializationScope))
-                               initializationScope.problemReporter().deprecatedType(this.binding.type, this.type);
+                               initializationScope.problemReporter().deprecatedType(
+                                               this.binding.type, this.type);
 
-                       this.type.binding = this.binding.type; // update binding for type reference
+                       this.type.resolvedType = this.binding.type; // update binding for
+                                                                                                               // type reference
 
                        // the resolution of the initialization hasn't been done
                        if (this.initialization == null) {
@@ -160,35 +178,53 @@ public class FieldDeclaration extends AbstractVariableDeclaration {
                                try {
                                        initializationScope.fieldDeclarationIndex = this.binding.id;
 
-                                       // break dead-lock cycles by forcing constant to NotAConstant
+                                       // break dead-lock cycles by forcing constant to
+                                       // NotAConstant
                                        this.binding.constant = Constant.NotAConstant;
-                                       
+
                                        TypeBinding typeBinding = this.binding.type;
                                        TypeBinding initializationTypeBinding;
-                                       
+
                                        if (initialization instanceof ArrayInitializer) {
 
-                                               if ((initializationTypeBinding = this.initialization.resolveTypeExpecting(initializationScope, typeBinding))    != null) {
+                                               if ((initializationTypeBinding = this.initialization
+                                                               .resolveTypeExpecting(initializationScope,
+                                                                               typeBinding)) != null) {
                                                        ((ArrayInitializer) this.initialization).binding = (ArrayBinding) initializationTypeBinding;
-                                                       this.initialization.implicitWidening(typeBinding, initializationTypeBinding);
+                                                       this.initialization.implicitWidening(typeBinding,
+                                                                       initializationTypeBinding);
                                                }
-                                       } else if ((initializationTypeBinding = initialization.resolveType(initializationScope)) != null) {
+                                       } else if ((initializationTypeBinding = initialization
+                                                       .resolveType(initializationScope)) != null) {
 
-                                               if (this.initialization.isConstantValueOfTypeAssignableToType(initializationTypeBinding, typeBinding)
-                                                       || (typeBinding.isBaseType() && BaseTypeBinding.isWidening(typeBinding.id, initializationTypeBinding.id))) {
+                                               if (this.initialization
+                                                               .isConstantValueOfTypeAssignableToType(
+                                                                               initializationTypeBinding, typeBinding)
+                                                               || (typeBinding.isBaseType() && BaseTypeBinding
+                                                                               .isWidening(typeBinding.id,
+                                                                                               initializationTypeBinding.id))) {
 
-                                                       this.initialization.implicitWidening(typeBinding, initializationTypeBinding);
+                                                       this.initialization.implicitWidening(typeBinding,
+                                                                       initializationTypeBinding);
 
-                                               }       else if (initializationScope.areTypesCompatible(initializationTypeBinding, typeBinding)) {
-                                                       this.initialization.implicitWidening(typeBinding, initializationTypeBinding);
+                                               } else if (initializationTypeBinding
+                                                               .isCompatibleWith(typeBinding)) {
+                                                       this.initialization.implicitWidening(typeBinding,
+                                                                       initializationTypeBinding);
 
                                                } else {
-                                                       initializationScope.problemReporter().typeMismatchError(initializationTypeBinding, typeBinding, this);
+                                                       initializationScope.problemReporter()
+                                                                       .typeMismatchError(
+                                                                                       initializationTypeBinding,
+                                                                                       typeBinding, this);
                                                }
-                                               if (this.binding.isFinal()){ // cast from constant actual type to variable type
-                                                       this.binding.constant =
-                                                               this.initialization.constant.castTo(
-                                                                       (this.binding.type.id << 4) + this.initialization.constant.typeID());
+                                               if (this.binding.isFinal()) { // cast from constant
+                                                                                                               // actual type to
+                                                                                                               // variable type
+                                                       this.binding.constant = this.initialization.constant
+                                                                       .castTo((this.binding.type.id << 4)
+                                                                                       + this.initialization.constant
+                                                                                                       .typeID());
                                                }
                                        } else {
                                                this.binding.constant = NotAConstant;
@@ -202,7 +238,7 @@ public class FieldDeclaration extends AbstractVariableDeclaration {
                }
        }
 
-       public void traverse(IAbstractSyntaxTreeVisitor visitor, MethodScope scope) {
+       public void traverse(ASTVisitor visitor, MethodScope scope) {
 
                if (visitor.visit(this, scope)) {
                        type.traverse(visitor, scope);
@@ -211,4 +247,25 @@ public class FieldDeclaration extends AbstractVariableDeclaration {
                }
                visitor.endVisit(this, scope);
        }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see java.lang.Object#equals(java.lang.Object)
+        */
+       public boolean equals(Object obj) {
+               if (obj instanceof FieldDeclaration) {
+                       char[] objName = ((FieldDeclaration) obj).name;
+                       if (name.length != objName.length) {
+                               return false;
+                       }
+                       for (int i = 0; i < objName.length; i++) {
+                               if (name[i] != objName[i]) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+               return super.equals(obj);
+       }
 }
\ No newline at end of file