| package org.eclipse.dltk.ruby.internal.ui.documentation; |
| |
| import java.io.Reader; |
| import java.io.StringReader; |
| |
| import org.eclipse.dltk.ast.ASTNode; |
| import org.eclipse.dltk.ast.declarations.ModuleDeclaration; |
| import org.eclipse.dltk.core.IMember; |
| import org.eclipse.dltk.core.IModelElement; |
| import org.eclipse.dltk.core.ISourceModule; |
| import org.eclipse.dltk.core.ISourceRange; |
| import org.eclipse.dltk.core.ModelException; |
| import org.eclipse.dltk.core.SourceParserUtil; |
| import org.eclipse.dltk.ruby.internal.parsers.jruby.ASTUtils; |
| import org.eclipse.dltk.ruby.typeinference.RubyClassType; |
| import org.eclipse.dltk.ti.BasicContext; |
| import org.eclipse.dltk.ti.DLTKTypeInferenceEngine; |
| import org.eclipse.dltk.ti.goals.ExpressionTypeGoal; |
| import org.eclipse.dltk.ti.types.IEvaluatedType; |
| import org.eclipse.dltk.ui.documentation.IScriptDocumentationProvider; |
| |
| public class RubyTypeDocumentationProvider implements |
| IScriptDocumentationProvider { |
| |
| @Override |
| public Reader getInfo(IMember element, boolean lookIntoParents, |
| boolean lookIntoExternal) { |
| ISourceModule module = (ISourceModule) element |
| .getAncestor(IModelElement.SOURCE_MODULE); |
| if (module != null) { |
| try { |
| ModuleDeclaration unit = SourceParserUtil.getModuleDeclaration(module); |
| ISourceRange sourceRange = element.getSourceRange(); |
| ASTNode minimalNode = ASTUtils.findMinimalNode(unit, |
| sourceRange.getOffset(), sourceRange.getOffset() |
| + sourceRange.getLength()); |
| if (minimalNode != null && minimalNode != unit) { |
| BasicContext context = new BasicContext(module, unit); |
| ExpressionTypeGoal goal = new ExpressionTypeGoal(context, minimalNode); |
| DLTKTypeInferenceEngine engine = new DLTKTypeInferenceEngine(); |
| IEvaluatedType type = engine.evaluateType(goal, 500); |
| if (type instanceof RubyClassType) { |
| RubyClassType rubyClassType = (RubyClassType) type; |
| return new StringReader("Inferenced type: " + rubyClassType.getModelKey()); //$NON-NLS-1$ |
| } |
| } |
| } catch (ModelException e) { |
| e.printStackTrace(); |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| public Reader getInfo(String content) { |
| return null; |
| } |
| |
| } |