2012-06-18 14 views
5

पर कनवर्ट करें मैं org.eclipse.jdt.core.dom.ITypeBinding इंस्टेंस को org.eclipse.jdt.core.dom.Type इंस्टेंस में कनवर्ट करने का एक सामान्य तरीका ढूंढ रहा हूं। हालांकि मुझे लगता है कि ऐसा करने के लिए कुछ एपीआई कॉल होना चाहिए, मैं एक का पता नहीं लगा सकता।ग्रहण जेडीटी आईटी टाइप बाइंडिंग को

विशिष्ट प्रकार के आधार पर इसे मैन्युअल रूप से करने के कई तरीके दिखाई देते हैं।

क्या ITypeBinding लेने का कोई सामान्य तरीका है और इन सभी विशेष मामलों के बिना Type प्राप्त करें? String लेना और Type लौटना भी स्वीकार्य होगा।

अद्यतन

प्रतिक्रिया से

अब तक, ऐसा लगता है मैं इन सब विशेष मामलों को संभालने के लिए नहीं है। ऐसा करने का पहला प्रयास यहां दिया गया है। मुझे यकीन है कि यह पूरी तरह से सही तो जांच की सराहना की नहीं है कर रहा हूँ:

public static Type typeFromBinding(AST ast, ITypeBinding typeBinding) { 
    if(ast == null) 
     throw new NullPointerException("ast is null"); 
    if(typeBinding == null) 
     throw new NullPointerException("typeBinding is null"); 

    if(typeBinding.isPrimitive()) { 
     return ast.newPrimitiveType(
      PrimitiveType.toCode(typeBinding.getName())); 
    } 

    if(typeBinding.isCapture()) { 
     ITypeBinding wildCard = typeBinding.getWildcard(); 
     WildcardType capType = ast.newWildcardType(); 
     ITypeBinding bound = wildCard.getBound(); 
     if(bound != null) { 
      capType.setBound(typeFromBinding(ast, bound)), 
       wildCard.isUpperbound()); 
     } 
     return capType; 
    } 

    if(typeBinding.isArray()) { 
     Type elType = typeFromBinding(ast, typeBinding.getElementType()); 
     return ast.newArrayType(elType, typeBinding.getDimensions()); 
    } 

    if(typeBinding.isParameterizedType()) { 
     ParameterizedType type = ast.newParameterizedType(
      typeFromBinding(ast, typeBinding.getErasure())); 

     @SuppressWarnings("unchecked") 
     List<Type> newTypeArgs = type.typeArguments(); 
     for(ITypeBinding typeArg : typeBinding.getTypeArguments()) { 
      newTypeArgs.add(typeFromBinding(ast, typeArg)); 
     } 

     return type; 
    } 

    // simple or raw type 
    String qualName = typeBinding.getQualifiedName(); 
    if("".equals(qualName)) { 
     throw new IllegalArgumentException("No name for type binding."); 
    } 
    return ast.newSimpleType(ast.newName(qualName)); 
} 
+1

एक छोटे से बग नहीं है: _capType.setBound (typeFromBinding (ast, ** wildCard.getBound() **), wildCard.isUpperbound()); _ typeBinding एक कच्चे संग्रह, wildCard.getBound है() शून्य वापस आ जाएगा और विधि एक वैध स्थिति के लिए एक प्रकार का उत्पादन करने में विफल हो जाएगा। आपको बस बाध्य जांचने और कोड को ठीक करने के लिए सेट करने की आवश्यकता नहीं है। – taksan

उत्तर

2

मुझे अभी एक वैकल्पिक समाधान मिला है जो बेहतर हो सकता है। आप org.eclipse.jdt.core.dom.rewrite.ImportRewrite का उपयोग कर सकते हैं, जो एक संकलन इकाई के आयात विवरणों का प्रबंधन करता है। टाइप ऐडपोर्ट (आईटी टाइप बाइंडिंग, एएसटी) का उपयोग करके, आप एक नए टाइप नोड को मौजूदा आयात को खाते में ले जा सकते हैं और यदि आवश्यक हो तो नए जोड़ सकते हैं।

+0

क्योंकि मैं इससे प्रभावित था: आयात रेवाइट की आवश्यकता है "एएसटी को आईसीओएमपीलेशन यूनिट से बनाया जाना है, इसका मतलब है कि एएसटी बनाने के दौरान एएसटीपार्सर.सेटसोर्स (आईसीओम्पिलेशन यूनिट) का उपयोग किया गया है"। – sevenforce

0

मुझे यकीन है कि क्या आप 'टाइप' वस्तु या क्यों आपको इसकी आवश्यकता के साथ क्या करना चाहते हैं नहीं कर रहा हूँ।

  • आप कहते हैं कि एक मौजूदा प्रकार नोड यानी TypeBinding के लिए घोषित नोड की जरूरत है - आप http://wiki.eclipse.org/JDT/FAQ#From_an_IBinding_to_its_declaring_ASTNode

  • उपयोग कर सकते हैं हालांकि, ASTRewrite के माध्यम से आप स्रोत को संशोधित करने तो इस्तेमाल किया जा सकता है अगर आप एक नया ASTNode की जरूरत इसे स्वयं को तैयार करना और सभी मामलों को संभालना है। ध्यान दें कि आपको सभी स्थितियों में 'प्रकार' के सभी उपप्रकारों को संभालने की आवश्यकता नहीं है, उदा। यूनियनटाइप (जावा 7) केवल पकड़ ब्लॉक में प्रासंगिक है।

+0

मुझे इसे 'एस्ट्र्राइट' के लिए चाहिए, जहां मैं अभिव्यक्ति के प्रकार को बदलने के बिना इनलाइन असाइनमेंट के माध्यम से अभिव्यक्ति परिणाम को एक नए चर में कैप्चर करना चाहता हूं। –

+0

मैंने मामलों को संभालने के लिए संभावित कोड के साथ प्रश्न अद्यतन किया। क्या आप किसी भी मामले का सुझाव दे सकते हैं? –

+0

एक त्वरित नज़र से मुझे ठीक लग रहा है। –

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