1 19 package org.netbeans.modules.javacore.jmiimpl.javamodel; 20 21 import org.netbeans.jmi.javamodel.*; 22 import org.netbeans.lib.java.parser.ASTree; 23 import org.netbeans.lib.java.parser.ASTreeTypes; 24 import org.netbeans.mdr.storagemodel.StorableObject; 25 import org.netbeans.modules.javacore.parser.ASTProvider; 26 import java.util.*; 27 28 32 public abstract class NewArrayExpressionImpl extends ExpressionImpl implements NewArrayExpression { 33 private ArrayInitialization initializer; 34 private LightAttrList dimensions; 35 private MultipartId typeName; 36 private int dimCount; 37 38 39 public NewArrayExpressionImpl(StorableObject o) { 40 super(o); 41 } 42 43 public MultipartId getTypeName() { 44 if (!childrenInited) { 45 initChildren(); 46 } 47 return typeName; 48 } 49 50 public void setTypeName(MultipartId typeName) { 51 objectChanged(CHANGED_TYPE); 52 changeChild(getTypeName(), typeName); 53 this.typeName = typeName; 54 } 55 56 public Type getType() { 57 Type t = (Type) getTypeName().getElement(); 58 int dims = getDimCount(); 59 ArrayClass arrayClass = ((JavaModelPackage)t.refImmediatePackage()).getArray(); 60 for (int i = 0; i < dims; i++) { 61 t = arrayClass.resolveArray(t); 62 } 63 return t; 64 } 65 66 public void setType(Type newValue) { 67 MultipartIdClass proxy = ((JavaModelPackage) refImmediatePackage()).getMultipartId(); 68 setTypeName(proxy.createMultipartId(newValue.getName(), null, null)); 69 } 70 71 public int getDimCount() { 72 if (isChanged(CHANGED_DIM_COUNT)) { 73 return dimCount; 74 } else { 75 ASTree dims = getASTree().getSubTrees()[2]; 76 int dimSize = dims == null ? 0 : (dims.getLastToken() - dims.getFirstToken() + 1) / 2; 77 return getDimensions().size() + dimSize; 78 } 79 } 80 81 public void setDimCount(int dimCount) { 82 objectChanged(CHANGED_DIM_COUNT); 83 this.dimCount = dimCount; 84 } 85 86 public ArrayInitialization getInitializer() { 87 if (!childrenInited) { 88 initChildren(); 89 } 90 return initializer; 91 } 92 93 public void setInitializer(ArrayInitialization initializer) { 94 objectChanged(CHANGED_INITIALIZER); 95 changeChild(getInitializer(), initializer); 96 this.initializer = initializer; 97 } 98 99 public List getDimensions() { 100 if (!childrenInited) { 101 initChildren(); 102 } 103 return dimensions; 104 } 105 106 public List getChildren() { 107 List list = new ArrayList(2 + getDimensions().size()); 108 addIfNotNull(list, getTypeName()); 109 list.addAll(getDimensions()); 110 addIfNotNull(list, getInitializer()); 111 return list; 112 } 113 114 protected void initChildren() { 115 childrenInited = false; 116 ASTree tree = getASTree(); 117 if (tree != null) { 118 ASTree[] parts = tree.getSubTrees(); 119 typeName = (MultipartId) initOrCreate(typeName, parts[0]); 120 dimensions = createChildrenList(dimensions, "dimensions", parts[1], ASTreeTypes.DIM_EXPRS, CHANGED_DIMENSIONS, false); initializer = (ArrayInitialization) initOrCreate(initializer, parts[3]); 122 } 123 childrenInited = true; 124 } 125 126 public String getSourceText() { 127 String origElem; 128 if ((origElem = checkChange()) != null) 129 return origElem; 130 StringBuffer buf = new StringBuffer (); 131 TransientElement initializer = (TransientElement) getInitializer(); 132 buf.append("new "); buf.append(((MetadataElement) getTypeName()).getSourceText()); 134 appendDimensions(buf); 135 if (initializer != null) { 136 buf.append(initializer.getSourceText()); 137 } 138 return buf.toString(); 139 } 140 141 private StringBuffer appendDimensions(StringBuffer buf) { 142 List exprs = getDimensions(); 143 int totalDim = getDimCount(); 144 for (Iterator iter = exprs.iterator(); iter.hasNext();) { 145 TransientElement expr = (TransientElement) iter.next(); 146 formatElementPart(ARRAY_OPEN_BRACKET, buf); 147 buf.append(expr.getSourceText()); 148 formatElementPart(ARRAY_CLOSE_BRACKET, buf); 149 totalDim--; 150 } 151 for (; totalDim > 0; totalDim--) { 152 formatElementPart(ARRAY_OPEN_BRACKET, buf); 153 formatElementPart(ARRAY_CLOSE_BRACKET, buf); 154 } 155 return buf; 156 } 157 158 public void getDiff(List diff) { 159 ASTProvider parser = getParser(); 160 ASTree tree = getASTree(); 161 ASTree[] children = tree.getSubTrees(); 162 163 getChildDiff(diff, parser, children[0], (MetadataElement) getTypeName(), CHANGED_TYPE); 164 if (isChanged(CHANGED_DIMENSIONS | CHANGED_DIM_COUNT)) { 165 ASTree startTree = children[1] == null ? children[2] : children[1]; 166 ASTree endTree = children[2] == null ? children[1] : children[2]; 167 diff.add(new DiffElement(getStartOffset(parser, startTree, false), getEndOffset(parser, endTree), appendDimensions(new StringBuffer ()).toString())); 168 } else { 169 getCollectionDiff(diff, parser, CHANGED_DIMENSIONS, children[1], ASTreeTypes.DIM_EXPRS, getDimensions(), 0, null); 170 } 171 int index = (children[2] == null ? (children[1] == null ? children[0] : children[1]) : children[2]).getLastToken(); 172 int startOffset = parser.getToken(index).getEndOffset(); 173 getChildDiff(diff, parser, children[3], (MetadataElement) getInitializer(), CHANGED_INITIAL_VALUE, startOffset, " "); } 175 176 void setData(List dimensions, ArrayInitialization initializer, MultipartId typeName, int dimCount) { 177 this.dimensions = createChildrenList("dimensions", dimensions, CHANGED_DIMENSIONS); changeChild(null, initializer); 181 this.initializer = initializer; 182 changeChild(null, typeName); 184 this.typeName = typeName; 185 this.dimCount = dimCount; 187 } 188 189 protected void _delete() { 190 if (childrenInited) { 192 deleteChildren(dimensions); 193 deleteChild(initializer); 194 deleteChild(typeName); 195 } 196 super._delete(); 200 } 201 202 public void replaceChild(Element oldElement,Element newElement) { 203 if (childrenInited) { 204 if (replaceObject(getDimensions(),oldElement,newElement)) 205 return; 206 if (oldElement.equals(initializer)) { 207 setInitializer((ArrayInitialization)newElement); 208 } else if (oldElement.equals(typeName)) { 209 setTypeName((MultipartId)newElement); 210 } 211 } 212 } 213 214 public Element duplicate(JavaModelPackage targetExtent) { 215 return targetExtent.getNewArrayExpression().createNewArrayExpression( 216 (MultipartId) duplicateElement(getTypeName(), targetExtent), 217 duplicateList(getDimensions(), targetExtent), 218 getDimCount(), 219 (ArrayInitialization) duplicateElement(getInitializer(), targetExtent) 220 ); 221 } 222 } 223 | Popular Tags |