| /******************************************************************************* |
| * Copyright (c) 2005, 2017 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 |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.core.mixin; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.dltk.compiler.ISourceElementRequestor; |
| import org.eclipse.dltk.core.IModelElement; |
| import org.eclipse.dltk.core.IParent; |
| import org.eclipse.dltk.core.ISourceModule; |
| import org.eclipse.dltk.core.ModelException; |
| |
| public class MixinSourceElementRequestor implements ISourceElementRequestor { |
| private List<String> path = new ArrayList<>(); |
| private IMixinRequestor requestor; |
| private boolean signature = false; |
| private ISourceModule module; |
| |
| public MixinSourceElementRequestor(IMixinRequestor requestor, |
| boolean signature, ISourceModule module) { |
| this.requestor = requestor; |
| this.signature = signature; |
| this.module = module; |
| } |
| |
| protected void enterElement(String path) { |
| this.path.add(path); |
| } |
| |
| private IModelElement getElement(IModelElement parent, int index) { |
| if (path.size() == index) { |
| return parent; |
| } |
| if (parent instanceof IParent) { |
| IParent par = (IParent) parent; |
| IModelElement[] children = null; |
| try { |
| children = par.getChildren(); |
| } catch (ModelException e) { |
| e.printStackTrace(); |
| throw new RuntimeException(e); |
| } |
| for (int i = 0; i < children.length; ++i) { |
| if (children[i].getElementName().equals(path.get(index))) { |
| IModelElement el = getElement(children[i], index + 1); |
| if (el != null) { |
| return el; |
| } |
| } |
| } |
| } |
| return null; |
| } |
| |
| protected IModelElement getModelElement() { |
| if (!signature) { |
| return null; |
| } |
| if (this.path.size() == 0) { |
| return this.module; |
| } |
| return getElement(this.module, 0); |
| } |
| |
| protected void exitElement() { |
| if (path.size() > 0) { |
| this.path.remove(this.path.size() - 1); |
| } |
| } |
| |
| protected String getKey() { |
| StringBuffer buffer = new StringBuffer(); |
| for (int i = 0; i < path.size(); ++i) { |
| buffer.append(path.get(i)); |
| if (i != path.size() - 1) { |
| buffer.append(IMixinRequestor.MIXIN_NAME_SEPARATOR); |
| } |
| } |
| return buffer.toString(); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void acceptFieldReference(String fieldName, int sourcePosition) { |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void acceptMethodReference(String methodName, int argCount, |
| int sourcePosition, int sourceEndPosition) { |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void acceptPackage(int declarationStart, int declarationEnd, |
| String name) { |
| } |
| |
| @Override |
| public void acceptTypeReference(String typeName, int sourcePosition) { |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public boolean enterFieldCheckDuplicates(FieldInfo info) { |
| return false; |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void enterMethodRemoveSame(MethodInfo info) { |
| } |
| |
| @Override |
| public void enterModule() { |
| } |
| |
| @Override |
| public void enterModuleRoot() { |
| } |
| |
| @Override |
| public boolean enterTypeAppend(String fullName, String delimiter) { |
| return false; |
| } |
| |
| @Override |
| public void exitModule(int declarationEnd) { |
| } |
| |
| @Override |
| public void exitModuleRoot() { |
| } |
| |
| @Override |
| public void exitField(int declarationEnd) { |
| exitElement(); |
| } |
| |
| @Override |
| public void exitMethod(int declarationEnd) { |
| exitElement(); |
| } |
| |
| @Override |
| public void exitType(int declarationEnd) { |
| exitElement(); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void enterField(FieldInfo info) { |
| enterElement(info.name); |
| IMixinRequestor.ElementInfo elInfo = new IMixinRequestor.ElementInfo(); |
| elInfo.key = getKey(); |
| if (signature) { |
| elInfo.object = getModelElement(); |
| } |
| requestor.reportElement(elInfo); |
| } |
| |
| public void updateField(FieldInfo fieldInfo, int flags) { |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void enterMethod(MethodInfo info) { |
| enterElement(info.name); |
| IMixinRequestor.ElementInfo elInfo = new IMixinRequestor.ElementInfo(); |
| elInfo.key = getKey(); |
| if (signature) { |
| elInfo.object = getModelElement(); |
| } |
| requestor.reportElement(elInfo); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void enterType(TypeInfo info) { |
| enterElement(info.name); |
| IMixinRequestor.ElementInfo elInfo = new IMixinRequestor.ElementInfo(); |
| elInfo.key = getKey(); |
| if (signature) { |
| elInfo.object = getModelElement(); |
| } |
| requestor.reportElement(elInfo); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void acceptImport(ImportInfo importInfo) { |
| } |
| |
| @Override |
| public void enterNamespace(String[] namespace) { |
| // TODO Auto-generated method stub |
| } |
| |
| @Override |
| public void exitNamespace() { |
| // TODO Auto-generated method stub |
| } |
| } |