2010-01-07 11 views
7

में एएसटी प्रसंस्करण के साथ हल नहीं कर रहा है मैं कुछ जावा कोड को संसाधित करने के लिए ग्रहण जेडीटी एएसटी पार्सर का उपयोग कर रहा हूं और फ़ील्ड और विधि घोषणाओं के लिए टाइप बाइंडिंग निकालने का प्रयास कर रहा हूं। ऐसा करने के लिए तर्क मेरे आगंतुक वर्ग के अंदर है (नीचे देखें)। दुर्भाग्य से, मुझे कोई भाग्य नहीं है और बाइंडिंग में से कोई भी हल नहीं कर रहा है (वे लगातार शून्य हैं)। दिलचस्प बात यह है कि बाइंडिंग ग्रहण एएसटीवीव प्लगइन के साथ एक ही कोड पर काम करती है। मैं क्या गलत कर रहा हूं?बाइंडिंग ग्रहण

यहां कुछ प्रासंगिक कोड स्निपेट हैं जो उम्मीद करेंगे कि किसी को यह पता लगाने में मदद मिलेगी कि क्या हो रहा है!

ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setKind(ASTParser.K_COMPILATION_UNIT); 
parser.setSource(source); 
parser.setResolveBindings(true); 
CompilationUnit unit = (CompilationUnit) parser.createAST(null); 

GenericVisitor visitor = new GenericVisitor(outDir + "//" + file.getName() + ".xml"); 
visitor.process(unit); 


public class GenericVisitor extends ASTVisitor 
{ 
    public void endVisit(FieldDeclaration node) 
    { 
     String bindingInfo = "";  
     ITypeBinding binding = node.getType().resolveBinding(); 

     if(binding == null) 
     {      
     System.out.println("field declaration binding = null"); 
     } 
     else 
     { 
     bindingInfo = binding.getQualifiedName(); 
     } 

     endVisitNode(node, bindingInfo); 
    } 

    public void endVisit(MethodInvocation node) 
    { 
     String bindingInfo = ""; 
     IMethodBinding binding = node.resolveMethodBinding(); 

    if(binding == null) 
    {      
     System.out.println("method binding = null"); 
    } 
    else 
    { 
     bindingInfo = binding.toString(); 
    } 

    endVisitNode(node, bindingInfo); 
    } 
} 

उत्तर

2

संभावित कारण यह है कि आपको सीधे विज़िटर इंस्टेंस में विधि को कॉल नहीं करना चाहिए।

unit.accept(visitor); 

CompilationUnit, ASTNode की मूल वर्ग, एक accept विधि है जो एक आगंतुक के प्रकार ASTVisitor है कि लेता है: आप की तरह कुछ करना चाहिए।

आगंतुक आपके द्वारा लिखी गई, GenericVisitor, उपवर्गों abstarct वर्ग ASTVisitor करता है और नोड प्रकार आप में intersted रहे हैं के लिए कार्यान्वयन ओवरराइड करता है। इसलिए मैं ऊपर के रूप में मंगलाचरण करने के लिए ठीक होगा अपने कोड को बदलने लगता है कि आपके मुसीबत।

1

एएसटीपार्सर सिर्फ पार्सर है: यह एक एएसटी बनाता है जो संकलन में पहला कदम है। वास्तविक कंपाइलर उससे अधिक कर रहा है: यह विभिन्न आगंतुकों को चलाता है जो अतिरिक्त जानकारी के साथ पेड़ को बढ़ाते हैं। उनमें से एक बाध्यकारी संकल्प आगंतुक है।

विशेष रूप से org.eclipse.jdt.internal.compiler.Compiler कक्षा में सार्वजनिक शून्य प्रक्रिया (संकलन UnitDeclaration इकाई, int i) विधि के शरीर पर एक नज़र डालें।

0

यदि आपकी बाइंडिंग शून्य हैं, तो मुझे पूरी तरह से यकीन नहीं है कि आपकी समस्या अन्य स्पष्टीकरणों से ढकी हुई है। हमारे कोड बेस में, हम निम्नलिखित करते हैं, और बाइंडिंग हमेशा देखते हैं:

public static ASTNode getASTNodeFromCompilationUnit(ICompilationUnit compUnit) { 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setResolveBindings(true); 
    parser.setSource(compUnit); 
    return parser.createAST(/* passing in monitor messes up previous monitor state */ null); 
} 

तो अंतर केवल मैं देख सकता हूँ बाइंडिंग को हल करने के लिए कॉल के आदेश, और तथ्य यह है कि हम कॉल नहीं करते हैं पार्सर पर सेटकिंड। कोई भी मौका आप इस कोड के साथ कोशिश कर सकते हैं और देखें कि क्या होता है?

8

जब आप उपयोग करते हैं: पार्सर.सेट स्रोत (स्रोत); परम "स्रोत" का प्रकार क्या है?

बाइंडिंग जानकारी जावा मॉडल से प्राप्त की जाती है। इसका मतलब है कि संकलन इकाई जावा मॉडल के सापेक्ष स्थित होना चाहिए। यह स्वचालित रूप से होता है जब स्रोत कोड सेटसोर्स (ICompilationUnit) या सेटसोर्स (IClassFile) से आता है। जब सेट 0 स्रोत (0]

यह http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/ASTParser.html से है मैं शायद लगता है कि तुम सिर्फ setProject (IJavaProject) और setUnitName (स्ट्रिंग) को कॉल करने के बिना setSource (चार []) का उपयोग

+0

एक भी parser.setEnvironment (...) का उपयोग कर सकते हैं: "। वातावरण है कि जब कोई IJavaProject उपलब्ध हैं इस्तेमाल किया जा सकता सेट" – roesslerj

-1

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

ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    parser.setResolveBindings(true); 
    parser.setBindingsRecovery(true); 
    Hashtable<String, String> options = JavaCore.getDefaultOptions(); 
    options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_6); 
    parser.setCompilerOptions(options); 
    parser.setEnvironment(classpath, sources, new String[] { "UTF-8", "UTF-8" }, true); 
    parser.setSource(fileContents.toCharArray()); 
    CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null); 
    IProblem[] problems = compilationUnit.getProblems(); 
    if (problems != null && problems.length > 0) { 
     logger.warn("Got {} problems compiling the source file: ", problems.length); 
     for (IProblem problem : problems) { 
      logger.warn("{}", problem); 
     } 
    } 
    return compilationUnit; 
+0

मैं इस तरह के कुछ को लागू करने की कोशिश कर रहा हूं, यहां क्लासपाथ और स्रोत चर क्या हैं? क्या आप उनके मूल्यों का एक उदाहरण दे सकते हैं? – Braden

+0

क्लासपाथ और स्रोत स्ट्रिंग्स के सरणी वास्तविक पथ के साथ हैं क्योंकि आप उन्हें जावा-क्लासपाथ विकल्प में देंगे। खेद है कि मुझे जवाब देने में इतना लंबा लगा ... – roesslerj

1

ठीक है, यह स्टैक ओवरफ़्लो पर मेरा पहला जवाब है। घबराए ...

मैं तुम्हारे साथ एक ही समस्या है, और जब से तुम किया है इस:

parser.setResolveBindings(true); 

देखते हैं कि क्या यह इस जाँच करके काम करते हैं:

if (unit.getAST().hasResolvedBindings()) { 
    System.out.println("Binding activated."); 
} 
else { 
    Ststem.out.println("Binding is not activated."); 
} 

और मुझे लगता है नतीजा यह है कि "बाध्यकारी सक्रिय नहीं है।" और यही कारण है कि आप हर समय शून्य सूचक मिलता है।

फिर, मैं अपने कोड के इस बयान जोड़ें:

parser.setEnvironment(null, null, null, true); 

जादुई ढंग से समस्या का समाधान होने !!! और मुझे लगता है कि आप इसे भी आजमा सकते हैं।

+0

ऐसा लगता है कि पर्यावरण केवल जेडीटी 3.6 से उपलब्ध है, लेकिन मेवेन केवल 3.3 तक है? आपने 3.6 कैसे स्थापित किया? –

1

समस्या यह है कि आपके पार्सर को अपने जावा मॉडल को बनाने के लिए आवश्यक जानकारी प्रदान नहीं की गई है जो बाइंडिंग को हल करने के लिए आवश्यक है।

यदि पार्सर का स्रोत setSource(ICompilationUnit) या setSource(IClassFile) से प्राप्त किया गया है तो यह जानकारी पार्सर को स्वचालित रूप से प्रदान की जाती है।

हालांकि, यदि आप इसके बजाय setSource(char[]) का उपयोग करते हैं, तो आपको यह संदर्भ पार्सर के लिए प्रदान करना होगा। यह या तो parser.setProject(IJavaProject) या setEnvironment(String[], String[], String[], boolean) और setUnitName(String)

फोन करके किया जा सकता है स्रोत: http://help.eclipse.org/kepler/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/ASTParser.html#setResolveBindings(boolean)

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