2009-11-18 10 views
52

मैं एक नया ग्रहण रिफैक्टरिंग लागू कर रहा हूं। यह डेवलपर्स को बाल विधि से पैरेंट विधि से पूर्व शर्त बयानों को खींचने में सक्षम बनाता है।कस्टम ग्रहण के पूर्वावलोकन में त्रुटि

यह सब ठीक से काम करता है जब मैं रिफैक्टरिंग विज़ार्ड में "समाप्त करें" का चयन करता हूं, लेकिन जब मैं "पूर्वावलोकन" चुनता हूं तो मुझे कोई त्रुटि नहीं मिलती है "कोई लक्षित संपादन प्रदान नहीं किया गया।" ऐसा लगता है कि TextEdit में ASTRewrite.rewriteAST() से एक समस्या आई है। हालांकि मैं समझ नहीं सकता क्यों।

अपवाद का स्टैक ट्रेस मेरे Refactoring.createChange() कोड चलाने के बाद होता है, और पूर्वावलोकन का उपयोग पूर्वावलोकन उत्पन्न करने के लिए किया जाता है।

org.eclipse.text.edits.MalformedTreeException: No target edit provided. 
at org.eclipse.text.edits.MoveSourceEdit.performConsistencyCheck(MoveSourceEdit.java:208) 
at org.eclipse.text.edits.TextEdit.traverseConsistencyCheck(TextEdit.java:873) 
at org.eclipse.text.edits.MoveSourceEdit.traverseConsistencyCheck(MoveSourceEdit.java:183) 
at org.eclipse.text.edits.TextEdit.traverseConsistencyCheck(TextEdit.java:869) 
at org.eclipse.text.edits.TextEdit.traverseConsistencyCheck(TextEdit.java:869) 
at org.eclipse.text.edits.TextEditProcessor.checkIntegrityDo(TextEditProcessor.java:176) 
at org.eclipse.text.edits.TextEdit.dispatchCheckIntegrity(TextEdit.java:743) 
at org.eclipse.text.edits.TextEditProcessor.performEdits(TextEditProcessor.java:151) 
at org.eclipse.ltk.core.refactoring.TextChange.getPreviewDocument(TextChange.java:534) 
at org.eclipse.ltk.core.refactoring.TextChange.getPreviewDocument(TextChange.java:403) 
at org.eclipse.ltk.core.refactoring.TextChange.getPreviewContent(TextChange.java:411) 
at org.eclipse.ltk.internal.ui.refactoring.TextEditChangePreviewViewer.setInput(TextEditChangePreviewViewer.java:209) 
at org.eclipse.ltk.internal.ui.refactoring.AbstractChangeNode.feedInput(AbstractChangeNode.java:99) 
at org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.showPreview(PreviewWizardPage.java:598) 
at org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.access$6(PreviewWizardPage.java:583) 
at org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage$7.selectionChanged(PreviewWizardPage.java:574) 
at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
at org.eclipse.core.runtime.Platform.run(Platform.java:888) 
at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2132) 
at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1669) 
at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1124) 
at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
at org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.setVisible(PreviewWizardPage.java:505) 
at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.makeVisible(RefactoringWizardDialog2.java:762) 
at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.showCurrentPage(RefactoringWizardDialog2.java:477) 
at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.nextOrPreviewPressed(RefactoringWizardDialog2.java:507) 
at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.access$2(RefactoringWizardDialog2.java:492) 
at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2$1.widgetSelected(RefactoringWizardDialog2.java:691) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473) 
at org.eclipse.jface.window.Window.runEventLoop(Window.java:825) 
at org.eclipse.jface.window.Window.open(Window.java:801) 
at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation$1.run(RefactoringWizardOpenOperation.java:143) 
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) 
at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation.run(RefactoringWizardOpenOperation.java:155) 
at org.jmlspecs.eclipse.refactor.action.AbstractMethodActionDelegate.run(AbstractMethodActionDelegate.java:78) 
at org.jmlspecs.eclipse.refactor.action.AbstractMethodActionDelegate.run(AbstractMethodActionDelegate.java:67) 
at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:251) 
at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584) 
at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501) 
at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:452) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473) 
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221) 
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1311) 
at org.eclipse.equinox.launcher.Main.main(Main.java:1287) 

वर्तमान कोड है कि परिवर्तन करता है इस तरह दिखता है:

CompilationUnit sourceNode = ... 
ASTRewrite sourceRewrite = ASTRewrite.create(sourceNode.getAST()); 

Statement statement = ... 
sourceRewrite.createMoveTarget(statement); 

CompilationUnit destinationNode = ... 
MethodDeclaration destinationMethod = ... 
ASTRewrite destinationRewrite = ASTRewrite.create(destinationNode.getAST()); 

ListRewrite lrw = destinationRewrite.getListRewrite(destinationMethod.getBody(), 
    Block.STATEMENTS_PROPERTY); 

lrw.insertFirst(statement, null); 

मुझे पता है कि जिस तरह से createMoveTarget प्रयोग किया जाता है कि यह कैसे प्रलेखित है नहीं है, लेकिन जब मैं नीचे की तरह, दस्तावेज़ का पालन स्रोत से कथन हटा दिया गया है लेकिन गंतव्य पर स्थानांतरित नहीं किया गया है और मुझे अभी भी पूर्वावलोकन में एक ही त्रुटि मिलती है।

CompilationUnit sourceNode = ... 
ASTRewrite sourceRewrite = ASTRewrite.create(sourceNode.getAST()); 

Statement statement = ... 
Statement replacement = sourceRewrite.createMoveTarget(statement); 
sourceRewrite.remove(statement, null); 

CompilationUnit destinationNode = ... 
MethodDeclaration destinationMethod = ... 
ASTRewrite destinationRewrite = ASTRewrite.create(destinationNode.getAST()); 

ListRewrite lrw = destinationRewrite.getListRewrite(destinationMethod.getBody(), 
    Block.STATEMENTS_PROPERTY); 

lrw.insertFirst(replacement, null); 

यहां रेफैक्टरिंग का प्रदर्शन करने का एक उदाहरण दिया गया है।

से पहले:

class A { 
    foo(int a) { 
     return a * 2; 
    } 
} 

class B { 
    foo(int a) { 
     JC.requires(a > 1); 

     return a * 3; 
    } 
} 

के बाद:

class A { 
    foo(int a) { 
     JC.requires(a > 1); 

     return a * 2; 
    } 
} 

class B extends A { 
    foo(int a) {   
     return a * 3; 
    } 
} 
+1

आपका रिफैक्टरिंग उदाहरण वास्तव में एक पुनरावर्तक नहीं है क्योंकि यह अर्थशास्त्र को बदलता है लेकिन यह आपके ऊपर है। स्टैक में स्रोतों के हिस्से के बाद कोड के साथ क्या गलत है यह बताना मुश्किल है। शायद आपको ट्रैक करना चाहिए कि MoveSourceEdit.setTargetEdit को नल तर्क के साथ क्यों नहीं कहा जाता है या नहीं कहा जाता है। –

+1

हाय पेट्र, आपके सुझाव के लिए धन्यवाद। मैं इसे और अधिक विस्तार से देखूंगा और अपने ग्रहण के प्रति ग्रहण की तुलना करूँगा। विनिर्देशों को पुन: सक्रिय करते समय अर्थशास्त्र के परिवर्तन के संबंध में, यह बहुत दिलचस्प है क्योंकि यह क्षेत्र में सबसे अकादमिक काम करता है। हालांकि फाउलर की परिभाषा केवल व्यवहार को बरकरार रखती है, उदाहरण के लिए पुल अप विधि वर्ग पदानुक्रम के अर्थशास्त्र को बदलती है। मैं कथन में एक नया खंड जोड़कर अर्थशास्त्र को संरक्षित करने के लिए एक विकल्प जोड़ सकता हूं। वैसे भी मैं आपको इसके साथ आगे चर्चा करने में दिलचस्पी लेता हूं। – iain

उत्तर

2

मैं eclipse.org लेख सबसे उपयोगी मुझे मिल शुरू करने के लिए मिल गया।

कोड डीबग करना शुरू करने के लिए एक अच्छी जगह org.eclipse.jdt.core.dom.rewrite.ASTRewrite, विशेष रूप से rewriteAST() विधि पर ब्रेकपॉइंट सेट करना है, फिर कुछ रिफैक्टरिंग ट्रिगर करें।

यहां कुछ ऐसे हैं जिन्हें आप उपयोगी पा सकते हैं। क्या आप विशेष रूप से कुछ भी ढूंढ रहे हैं या एएसटी को संसाधित करने के सामान्य ज्ञान की तलाश कर रहे हैं?

http://www.ibm.com/developerworks/opensource/library/os-ast/ 
http://blog.sahits.ch/?p=228 
http://www.vogella.com/articles/EclipseJDT/article.html 
+0

हाय, सुझाव और लिंक के लिए धन्यवाद। मैंने आईबीएम और वोगेला लिंक देखा था लेकिन दूसरा नहीं। यह एक लंबा समय है जब से मैंने इस कोड पर काम किया था, यह एक मास्टर शोध प्रबंध का हिस्सा था और उपयोग करने के लिए पर्याप्त कार्यात्मक था। मैं आने वाले हफ्तों में कोड खोदूँगा और देख सकता हूं कि मैं इस मुद्दे को हल कर सकता हूं या नहीं। मैं हर बार खो गया जब मैंने jdt डीबग किया। संकेत के स्तर अंतहीन हैं और स्टॉक रिफैक्टरिंग को एक निजी अमूर्त परत के साथ कार्यान्वित किया जाता है जो उन्हें समझने में कठोर बनाता है। – iain

संबंधित मुद्दे