private void selectOnColonExpression(ModuleDeclaration parsedUnit, RubyColonExpression node) { BasicContext basicContext = new BasicContext(sourceModule, parsedUnit); ColonExpressionEvaluator evaluator = new ColonExpressionEvaluator(new ExpressionTypeGoal(basicContext, node)); IGoal[] init = evaluator.init(); if (init == null || init.length == 0) { // should never be here // System.err.println("Why did ColonExpressionEvaluator evaluated so // fast?"); } else { IEvaluatedType leftType = inferencer.evaluateType((AbstractTypeGoal) init[0], -1); IGoal[] goals = evaluator.subGoalDone(init[0], leftType, GoalState.DONE); if (goals == null || goals.length == 0) { // good, we have // type-constant Object evaluatedType = evaluator.produceResult(); if (evaluatedType instanceof RubyClassType) { RubyMixinClass mixinClass = mixinModel.createRubyClass((RubyClassType) evaluatedType); if (mixinClass != null) addArrayToCollection(mixinClass.getSourceTypes(), selectionElements); } } else { if (goals[0] instanceof NonTypeConstantTypeGoal) { processNonTypeConstant((NonTypeConstantTypeGoal) (goals[0])); } } } }
private IType[] getSourceTypesForClass(ModuleDeclaration parsedUnit, ASTNode statement) { ExpressionTypeGoal typeGoal = new ExpressionTypeGoal(new BasicContext(sourceModule, parsedUnit), statement); IEvaluatedType evaluatedType = this.inferencer.evaluateType(typeGoal, 5000); if (evaluatedType instanceof RubyClassType) { RubyMixinClass mixinClass = mixinModel.createRubyClass((RubyClassType) evaluatedType); if (mixinClass != null) return mixinClass.getSourceTypes(); } return new IType[0]; }
private void selectOnSuper(ModuleDeclaration parsedUnit, RubySuperExpression superExpr) { RubyClassType selfClass = RubyTypeInferencingUtils.determineSelfClass( mixinModel, sourceModule, parsedUnit, superExpr.sourceStart()); MethodDeclaration enclosingMethod = ASTUtils.getEnclosingMethod(wayToNode, superExpr, false); if (enclosingMethod != null) { String name = enclosingMethod.getName(); RubyMixinClass rubyClass = mixinModel.createRubyClass(selfClass); RubyMixinClass superclass = rubyClass.getSuperclass(); RubyMixinMethod method = superclass.getMethod(name); if (method != null) { IMethod[] sourceMethods = method.getSourceMethods(); addArrayToCollection(sourceMethods, selectionElements); } } }
private void selectOnConstant(ModuleDeclaration parsedUnit, ConstantReference node) { BasicContext basicContext = new BasicContext(sourceModule, parsedUnit); ConstantReferenceEvaluator evaluator = new ConstantReferenceEvaluator(new ExpressionTypeGoal(basicContext, node)); IGoal[] init = evaluator.init(); if (init == null || init.length == 0) { Object evaluatedType = evaluator.produceResult(); if (evaluatedType instanceof RubyClassType) { RubyMixinClass mixinClass = mixinModel.createRubyClass((RubyClassType) evaluatedType); if (mixinClass != null) addArrayToCollection(mixinClass.getSourceTypes(), selectionElements); } } else if (init[0] instanceof NonTypeConstantTypeGoal) { // it'a non-type constant processNonTypeConstant((NonTypeConstantTypeGoal) init[0]); } }
@Override public IModelElement[] select( IModuleSource sourceUnit, int selectionSourceStart, int selectionSourceEnd) { sourceModule = (ISourceModule) sourceUnit.getModelElement(); mixinModel = RubyMixinModel.getInstance(sourceModule.getScriptProject()); String source = sourceUnit.getSourceContents(); if (DEBUG) { System.out.print("SELECTION IN "); // $NON-NLS-1$ System.out.print(sourceUnit.getFileName()); System.out.print(" FROM "); // $NON-NLS-1$ System.out.print(selectionSourceStart); System.out.print(" TO "); // $NON-NLS-1$ System.out.println(selectionSourceEnd); System.out.println("SELECTION - Source :"); // $NON-NLS-1$ System.out.println(source); } if (!checkSelection(source, selectionSourceStart, selectionSourceEnd)) { return new IModelElement[0]; } actualSelectionEnd--; // inclusion fix if (DEBUG) { System.out.print("SELECTION - Checked : \""); // $NON-NLS-1$ System.out.print(source.substring(actualSelectionStart, actualSelectionEnd + 1)); System.out.println('"'); } try { ModuleDeclaration parsedUnit = this.parser.parse(sourceUnit); if (parsedUnit != null) { if (DEBUG) { System.out.println("SELECTION - AST :"); // $NON-NLS-1$ System.out.println(parsedUnit.toString()); } ASTNode node = ASTUtils.findMinimalNode(parsedUnit, actualSelectionStart, actualSelectionEnd); if (node == null) return new IModelElement[0]; this.wayToNode = ASTUtils.restoreWayToNode(parsedUnit, node); if (node instanceof TypeDeclaration) { selectionOnTypeDeclaration(parsedUnit, (TypeDeclaration) node); } else if (node instanceof MethodDeclaration) { selectionOnMethodDeclaration(parsedUnit, (MethodDeclaration) node); } else if (node instanceof ConstantReference || node instanceof RubyColonExpression) { selectTypes(parsedUnit, node); } else if (node instanceof VariableReference) { selectionOnVariable(parsedUnit, (VariableReference) node); } else if (node instanceof RubyMethodArgument) { selectOnMethodArgument(parsedUnit, (RubyMethodArgument) node); } else if (node instanceof RubySuperExpression) { selectOnSuper(parsedUnit, (RubySuperExpression) node); } else { CallExpression parentCall = this.getEnclosingCallNode(node); if (parentCall != null) { selectOnMethod(parsedUnit, parentCall); } else { // parentCall == null } } } } catch (IndexOutOfBoundsException e) { // work-around internal failure RubyPlugin.log(e); } return selectionElements.toArray(new IModelElement[selectionElements.size()]); }