|
From: <caw...@us...> - 2007-08-16 15:57:47
|
Revision: 2991
http://rubyeclipse.svn.sourceforge.net/rubyeclipse/?rev=2991&view=rev
Author: cawilliams
Date: 2007-08-16 08:57:45 -0700 (Thu, 16 Aug 2007)
Log Message:
-----------
add quick fix for method_missing without respond_to? warning
Modified Paths:
--------------
trunk/com.aptana.rdt.ui/META-INF/MANIFEST.MF
trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/CorrectionProposal.java
trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java
trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/QuickFixProcessor.java
Modified: trunk/com.aptana.rdt.ui/META-INF/MANIFEST.MF
===================================================================
--- trunk/com.aptana.rdt.ui/META-INF/MANIFEST.MF 2007-08-16 15:57:38 UTC (rev 2990)
+++ trunk/com.aptana.rdt.ui/META-INF/MANIFEST.MF 2007-08-16 15:57:45 UTC (rev 2991)
@@ -12,6 +12,8 @@
org.rubypeople.rdt.core,
com.aptana.rdt,
org.rubypeople.rdt.ui,
- org.rubypeople.rdt.launching
+ org.rubypeople.rdt.launching,
+ org.jruby,
+ org.rubypeople.rdt.refactoring
Eclipse-LazyStart: true
Export-Package: com.aptana.rdt.internal.ui.preferences
Modified: trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/CorrectionProposal.java
===================================================================
--- trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/CorrectionProposal.java 2007-08-16 15:57:38 UTC (rev 2990)
+++ trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/CorrectionProposal.java 2007-08-16 15:57:45 UTC (rev 2991)
@@ -19,7 +19,7 @@
@Override
public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
IDocument document= viewer.getDocument();
- apply(document, trigger, offset);
+ apply(document, trigger, getReplacementOffset());
}
}
Modified: trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java
===================================================================
--- trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java 2007-08-16 15:57:38 UTC (rev 2990)
+++ trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java 2007-08-16 15:57:45 UTC (rev 2991)
@@ -18,8 +18,12 @@
}
public static void addReplacementProposal(String replacement, String display, IProblemLocation problem, Collection<IRubyCompletionProposal> proposals) {
+ addReplacementProposal(problem.getOffset(), problem.getLength(), replacement, display, proposals);
+ }
+
+ public static void addReplacementProposal(int offset, int length, String replacement, String display, Collection<IRubyCompletionProposal> proposals) {
Image image= RubyPlugin.getDefault().getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
- CorrectionProposal proposal = new CorrectionProposal(replacement, problem.getOffset(), problem.getLength(), image, display, 100);
+ CorrectionProposal proposal = new CorrectionProposal(replacement, offset, length, image, display, 100);
proposals.add(proposal);
}
Modified: trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/QuickFixProcessor.java
===================================================================
--- trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/QuickFixProcessor.java 2007-08-16 15:57:38 UTC (rev 2990)
+++ trunk/com.aptana.rdt.ui/src/com/aptana/rdt/internal/ui/text/correction/QuickFixProcessor.java 2007-08-16 15:57:45 UTC (rev 2991)
@@ -3,16 +3,31 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
+import java.util.Map;
import org.eclipse.core.runtime.CoreException;
+import org.jruby.ast.ClassNode;
+import org.jruby.ast.DefnNode;
+import org.jruby.ast.ModuleNode;
+import org.jruby.ast.Node;
+import org.jruby.ast.visitor.rewriter.DefaultFormatHelper;
+import org.jruby.ast.visitor.rewriter.FormatHelper;
+import org.jruby.ast.visitor.rewriter.ReWriteVisitor;
import org.rubypeople.rdt.core.IRubyScript;
import org.rubypeople.rdt.core.compiler.IProblem;
+import org.rubypeople.rdt.core.formatter.Indents;
+import org.rubypeople.rdt.internal.formatter.IndentationState;
+import org.rubypeople.rdt.internal.ti.util.ClosestSpanningNodeLocator;
+import org.rubypeople.rdt.internal.ti.util.INodeAcceptor;
+import org.rubypeople.rdt.internal.ui.rubyeditor.ASTProvider;
+import org.rubypeople.rdt.refactoring.core.NodeFactory;
import org.rubypeople.rdt.ui.text.ruby.IInvocationContext;
import org.rubypeople.rdt.ui.text.ruby.IProblemLocation;
import org.rubypeople.rdt.ui.text.ruby.IQuickFixProcessor;
import org.rubypeople.rdt.ui.text.ruby.IRubyCompletionProposal;
import com.aptana.rdt.internal.parser.warnings.ConstantNamingConvention;
+import com.aptana.rdt.internal.parser.warnings.MethodMissingWithoutRespondTo;
import com.aptana.rdt.internal.parser.warnings.MisspelledConstructorVisitor;
public class QuickFixProcessor implements IQuickFixProcessor {
@@ -55,9 +70,46 @@
String constName = src.substring(problem.getOffset(), problem.getOffset() + problem.getLength());
LocalCorrectionsSubProcessor.addReplacementProposal(constName.toUpperCase(), "Convert to all uppercase", problem, proposals);
break;
+ case MethodMissingWithoutRespondTo.PROBLEM_ID:
+ // FIXME Only do this stuff when we apply the proposal! Don't do all this work just to create the proposal...
+ script = context.getRubyScript();
+ src = script.getSource();
+ int offset = 0;
+ Node rootNode = ASTProvider.getASTProvider().getAST(script, ASTProvider.WAIT_YES, null);
+ Node typeNode = ClosestSpanningNodeLocator.Instance().findClosestSpanner(rootNode, problem.getOffset(), new INodeAcceptor() {
+
+ public boolean doesAccept(Node node) {
+ return node instanceof ClassNode || node instanceof ModuleNode;
+ }
+
+ });
+ if (typeNode instanceof ClassNode) {
+ ClassNode classNode = (ClassNode) typeNode;
+ offset = classNode.getBodyNode().getPosition().getStartOffset();
+ } else if (typeNode instanceof ModuleNode) {
+ ModuleNode classNode = (ModuleNode) typeNode;
+ offset = classNode.getBodyNode().getPosition().getStartOffset();
+ }
+ DefnNode methodNode = NodeFactory.createMethodNode("respond_to?", new String[] {"symbol", "include_private = false"}, null);
+ Node insert = NodeFactory.createBlockNode(true, NodeFactory.createNewLineNode(methodNode));
+ String text = ReWriteVisitor.createCodeFromNode(insert, src, getFormatHelper());
+ // Figure out indent at offset and apply that to each line of text and at end of text
+ String line = src.substring(0, src.indexOf("\n", offset));
+ line = line.substring(line.lastIndexOf("\n") + 1);
+ Map options = script.getRubyProject().getOptions(true);
+ String indent = Indents.extractIndentString(line, options);
+ text = indent + text;
+ text = text.replaceAll("\\n", "\n" + indent);
+ text = text + "\n";
+ LocalCorrectionsSubProcessor.addReplacementProposal(offset, 0, text, "Add respond_to? method stub", proposals);
+ break;
default:
}
}
+
+ protected FormatHelper getFormatHelper() {
+ return new DefaultFormatHelper();
+ }
public boolean hasCorrections(IRubyScript unit, int problemId) {
switch (problemId) {
@@ -67,6 +119,7 @@
case IProblem.ArgumentIsNeverUsed:
case MisspelledConstructorVisitor.PROBLEM_ID:
case ConstantNamingConvention.PROBLEM_ID:
+ case MethodMissingWithoutRespondTo.PROBLEM_ID:
return true;
default:
return false;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|