blob: a04801d1f22d788631357add35c726ef4535be3a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2016 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
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;
}
}