1 11 package org.eclipse.jdt.internal.core.jdom; 12 13 import java.util.Map ; 14 15 import org.eclipse.jdt.core.JavaCore; 16 import org.eclipse.jdt.core.compiler.CategorizedProblem; 17 import org.eclipse.jdt.core.compiler.CharOperation; 18 import org.eclipse.jdt.core.jdom.*; 19 import org.eclipse.jdt.internal.compiler.ISourceElementRequestor; 20 import org.eclipse.jdt.internal.compiler.SourceElementParser; 21 import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; 22 import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; 23 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; 24 import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; 25 31 public class SimpleDOMBuilder extends AbstractDOMBuilder implements ISourceElementRequestor { 32 33 36 public void acceptProblem(CategorizedProblem problem) { 37 } 39 40 public void acceptImport(int declarationStart, int declarationEnd, char[][] tokens, boolean onDemand, int modifiers) { 41 int[] sourceRange = {declarationStart, declarationEnd}; 42 String importName = new String (CharOperation.concatWith(tokens, '.')); 43 44 if (onDemand) { 45 importName+=".*"; } 47 fNode= new DOMImport(fDocument, sourceRange, importName, onDemand, modifiers); 48 addChild(fNode); 49 } 50 public void acceptPackage(int declarationStart, int declarationEnd, char[] name) { 51 int[] sourceRange= new int[] {declarationStart, declarationEnd}; 52 fNode= new DOMPackage(fDocument, sourceRange, CharOperation.charToString(name)); 53 addChild(fNode); 54 } 55 58 public IDOMCompilationUnit createCompilationUnit(String sourceCode, String name) { 59 return createCompilationUnit(sourceCode.toCharArray(), name.toCharArray()); 60 } 61 64 public IDOMCompilationUnit createCompilationUnit(ICompilationUnit compilationUnit) { 65 initializeBuild(compilationUnit.getContents(), true, true); 66 getParser(JavaCore.getOptions()).parseCompilationUnit(compilationUnit, false); 67 return super.createCompilationUnit(compilationUnit); 68 } 69 72 protected void enterAbstractMethod(MethodInfo methodInfo) { 73 74 int[] sourceRange = {methodInfo.declarationStart, -1}; int[] nameRange = {methodInfo.nameSourceStart, methodInfo.nameSourceEnd}; 76 fNode = new DOMMethod(fDocument, sourceRange, CharOperation.charToString(methodInfo.name), nameRange, methodInfo.modifiers, 77 methodInfo.isConstructor, CharOperation.charToString(methodInfo.returnType), 78 CharOperation.charArrayToStringArray(methodInfo.parameterTypes), 79 CharOperation.charArrayToStringArray(methodInfo.parameterNames), 80 CharOperation.charArrayToStringArray(methodInfo.exceptionTypes)); 81 addChild(fNode); 82 fStack.push(fNode); 83 84 } 86 88 public void enterConstructor(MethodInfo methodInfo) { 89 90 String nameString = new String (fDocument, methodInfo.nameSourceStart, methodInfo.nameSourceEnd - methodInfo.nameSourceStart); 91 int openParenPosition = nameString.indexOf('('); 92 if (openParenPosition > -1) 93 methodInfo.nameSourceEnd = methodInfo.nameSourceStart + openParenPosition - 1; 94 95 enterAbstractMethod(methodInfo); 96 } 97 99 public void enterField(FieldInfo fieldInfo) { 100 101 int[] sourceRange = {fieldInfo.declarationStart, -1}; 102 int[] nameRange = {fieldInfo.nameSourceStart, fieldInfo.nameSourceEnd}; 103 boolean isSecondary= false; 104 if (fNode instanceof DOMField) { 105 isSecondary = fieldInfo.declarationStart == fNode.fSourceRange[0]; 106 } 107 fNode = new DOMField(fDocument, sourceRange, CharOperation.charToString(fieldInfo.name), nameRange, 108 fieldInfo.modifiers, CharOperation.charToString(fieldInfo.type), isSecondary); 109 addChild(fNode); 110 fStack.push(fNode); 111 } 112 115 public void enterInitializer(int declarationSourceStart, int modifiers) { 116 int[] sourceRange = {declarationSourceStart, -1}; 117 fNode = new DOMInitializer(fDocument, sourceRange, modifiers); 118 addChild(fNode); 119 fStack.push(fNode); 120 } 121 123 public void enterMethod(MethodInfo methodInfo) { 124 enterAbstractMethod(methodInfo); 125 } 126 128 public void enterType(TypeInfo typeInfo) { 129 if (fBuildingType) { 130 int[] sourceRange = {typeInfo.declarationStart, -1}; int[] nameRange = new int[] {typeInfo.nameSourceStart, typeInfo.nameSourceEnd}; 132 fNode = new DOMType(fDocument, sourceRange, new String (typeInfo.name), nameRange, 133 typeInfo.modifiers, CharOperation.charArrayToStringArray(typeInfo.superinterfaces), TypeDeclaration.kind(typeInfo.modifiers) == TypeDeclaration.CLASS_DECL); addChild(fNode); 135 fStack.push(fNode); 136 137 } 139 } 140 146 public void exitConstructor(int declarationEnd) { 147 exitMember(declarationEnd); 148 } 149 151 public void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd) { 152 exitMember(declarationEnd); 153 } 154 156 public void exitInitializer(int declarationEnd) { 157 exitMember(declarationEnd); 158 } 159 165 protected void exitMember(int declarationEnd) { 166 DOMMember m= (DOMMember) fStack.pop(); 167 m.setSourceRangeEnd(declarationEnd); 168 fNode = m; 169 } 170 172 public void exitMethod(int declarationEnd, int defaultValueStart, int defaultValueEnd) { 173 exitMember(declarationEnd); 174 } 175 181 public void exitType(int declarationEnd) { 182 exitType(declarationEnd, declarationEnd); 183 } 184 187 protected SourceElementParser getParser(Map settings) { 188 return new SourceElementParser(this, new DefaultProblemFactory(), new CompilerOptions(settings), false, true); 189 } 190 } 191 | Popular Tags |