/******************************************************************************* * Copyright (c) 2005, 2016 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.ruby.core.model.internal; import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.dltk.ast.declarations.ModuleDeclaration; import org.eclipse.dltk.ast.parser.ISourceParser; import org.eclipse.dltk.compiler.env.IModuleSource; import org.eclipse.dltk.core.DLTKLanguageManager; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IParent; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.ruby.core.RubyNature; import org.eclipse.dltk.ruby.core.model.ASTCaching; import org.eclipse.dltk.ruby.core.model.IElement; import org.eclipse.dltk.ruby.core.model.IElementCriteria; import org.eclipse.dltk.ruby.core.model.IElementKind; import org.eclipse.dltk.ruby.core.model.IModel; public class Model implements IModel { private final IScriptProject project; private final Map<ISourceModule, SoftReference<ModuleDeclaration>> sourceModulesToASTs = new HashMap<ISourceModule, SoftReference<ModuleDeclaration>>(); public Model(IScriptProject project) { this.project = project; } @Override public ModuleDeclaration getASTNode(ISourceModule sourceModule, ASTCaching caching) { ModuleDeclaration result = null; SoftReference<ModuleDeclaration> astNode = sourceModulesToASTs .get(sourceModule); if (astNode != null && caching != ASTCaching.REPARSE) result = astNode.get(); if (result == null && caching != ASTCaching.CACHED_ONLY) { ISourceParser parser = DLTKLanguageManager .getSourceParser(RubyNature.NATURE_ID); result = (ModuleDeclaration) parser.parse( (IModuleSource) sourceModule, null); if (result != null) { astNode = new SoftReference<ModuleDeclaration>(result); sourceModulesToASTs.put(sourceModule, astNode); } } return result; } public ISourceModule[] search(String name) { Collection<ISourceModule> sourceModules = new ArrayList<ISourceModule>(); try { IModelElement[] children = project.getChildren(); addModules(sourceModules, children); } catch (ModelException e) { e.printStackTrace(); } return sourceModules.toArray(new ISourceModule[sourceModules.size()]); } private void addModules(Collection<ISourceModule> sourceModules, IModelElement[] children) throws ModelException { for (int i = 0; i < children.length; i++) { IModelElement element = children[i]; if (element instanceof ISourceModule) sourceModules.add((ISourceModule) element); else if (element instanceof IParent) addModules(sourceModules, ((IParent) element).getChildren()); } } @Override public IElement[] findChildren(IElementCriteria criteria, String name, IProgressMonitor pm) { if (criteria == IElementCriteria.CLASS_OR_MIXIN) { } return null; } @Override public IElement getAncestor(IElementCriteria criteria) { return null; } @Override public IElementKind getElementKind() { return IElementKind.MODEL; } }