/******************************************************************************* * Copyright (c) 2005, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.jsdt.internal.oaametadata; import org.eclipse.wst.jsdt.internal.compiler.ISourceElementRequestor; import org.eclipse.wst.jsdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.wst.jsdt.internal.compiler.util.HashtableOfObject; public class MetadataSourceElementNotifier { LibraryAPIs apis; ISourceElementRequestor requestor; HashtableOfObject notifiedTypes=new HashtableOfObject(); public MetadataSourceElementNotifier(LibraryAPIs apis, ISourceElementRequestor requestor) { this.requestor=requestor; this.apis=apis; } public void notifyRequestor() { this.requestor.enterCompilationUnit(); if (this.apis.classes!=null) for (int i = 0; i < apis.classes.length; i++) { notifySourceElementRequestor(this.apis.classes[i]); } this.requestor.exitCompilationUnit(0); } public void notifySourceElementRequestor( ClassData clazz ) { char [] typeName=clazz.name.toCharArray(); // prevent possible recurrsion if (notifiedTypes.containsKey(typeName)) return; notifiedTypes.put(typeName, null); ISourceElementRequestor.TypeInfo typeInfo = new ISourceElementRequestor.TypeInfo(); typeInfo.declarationStart = 0; typeInfo.modifiers = 0; typeInfo.name = typeName; typeInfo.nameSourceStart = 0;//type.getNameStart(); typeInfo.nameSourceEnd = 0;//typeInfo.nameSourceStart+typeInfo.name.length-1; String superClass=clazz.getSuperClass(); if (superClass!=null) typeInfo.superclass =superClass.toCharArray(); typeInfo.secondary = false; typeInfo.anonymousMember = false; requestor.enterType(typeInfo); Property[] fields = clazz.getFields(); for (int attributeInx=0; attributeInx<fields.length; attributeInx++) { Property field = fields[attributeInx]; ISourceElementRequestor.FieldInfo fieldInfo = new ISourceElementRequestor.FieldInfo(); fieldInfo.declarationStart = 0;//field.sourceStart(); fieldInfo.name = field.name.toCharArray(); fieldInfo.modifiers = 0; if (field.isStatic()) fieldInfo.modifiers |= ClassFileConstants.AccStatic; fieldInfo.nameSourceStart = 0;//field.nameStart; fieldInfo.nameSourceEnd = 0;//field.nameStart+field.name.length-1; fieldInfo.type = field.dataType!=null ? field.dataType.toCharArray():null; // fieldInfo.annotationPositions = collectAnnotationPositions(fieldDeclaration.annotations); // fieldInfo.categories = (char[][]) this.nodesToCategories.get(fieldDeclaration); requestor.enterField(fieldInfo); // //If this field is of an anonymous type, need to notify so that it shows as a child // if( field.type != null && field.type.isAnonymous && !field.type.isNamed() ){ // notifySourceElementRequestor( field.type ); // } int initializationStart=0;//field.initializationStart; requestor.exitField(initializationStart,0,0/*field.sourceEnd(),field.sourceEnd()*/); } if (clazz.constructors!=null) for (int methodInx=0;methodInx<clazz.constructors.length;methodInx++) { Method method=clazz.constructors[methodInx]; boolean isConstructor=true; notifyMethod(method, isConstructor); } if (clazz.methods!=null) for (int methodInx=0;methodInx<clazz.methods.length;methodInx++) { Method method=clazz.methods[methodInx]; boolean isConstructor=false; notifyMethod(method, isConstructor); } requestor.exitType(0/*clazz.sourceEnd*/); } private void notifyMethod(Method method, boolean isConstructor) { ISourceElementRequestor.MethodInfo methodInfo = new ISourceElementRequestor.MethodInfo(); methodInfo.isConstructor = isConstructor; char[][] argumentTypes = null; char[][] argumentNames = null; Parameter [] arguments = method.parameters; if (arguments != null) { int argumentLength = arguments.length; argumentTypes = new char[argumentLength][]; argumentNames = new char[argumentLength][]; for (int i = 0; i < argumentLength; i++) { if (arguments[i].dataType!=null) argumentTypes[i] = arguments[i].dataType.toCharArray(); argumentNames[i] = arguments[i].name.toCharArray(); } } // int selectorSourceEnd = this.sourceEnds.get(methodDeclaration); methodInfo.declarationStart = 0;//methodDeclaration.declarationSourceStart; methodInfo.modifiers = 0; if (method.isStatic()) methodInfo.modifiers |= ClassFileConstants.AccStatic; methodInfo.name =(isConstructor)? new char[0] : method.name.toCharArray(); methodInfo.nameSourceStart = 0;//method.nameStart; methodInfo.nameSourceEnd = 0;//method.nameStart+method.name.length-1; methodInfo.parameterTypes = argumentTypes; methodInfo.parameterNames = argumentNames; methodInfo.categories =null;// (char[][]) this.nodesToCategories.get(methodDeclaration); requestor.enterMethod(methodInfo); requestor.exitMethod(0/*methodDeclaration.declarationSourceEnd*/, -1, -1); } }