[jbosstools-dev] Problem with CDI Builder creating new 'A' type

Xavier Coulon xcoulon at redhat.com
Wed Aug 1 04:05:59 EDT 2012


Denis, Viacheslav,

Thanks for your replies. I'm going to look at checking if the created type really exists - I think it works: element.exist() returned false for the class 'A', I'm doing more testing today. 
Otherwise, I'll skip events related to any 'package-info.java' resource. 

Best regards,
/Xavier



On Aug 1, 2012, at 2:42 AM, Denis Golovin wrote:

> Xavier,
> 
> Looked through the code and didn't find better way to handle annotation type resolution ether. 
> I guess you can check compilation unit name and skip units with name "package-info.java".
> 
> Denis
> 
> On 07/31/2012 01:46 PM, Viacheslav Kabanovich wrote:
>> Hello Xavier,
>> 
>> This class is temporary created in a working copy that is discarded in the same method in order to get IType as context for resolution of referenced types. For example, package-info.java may have this content
>> 
>> @Named
>> package cdi.test.alternative.case1;
>> import javax.inject.*;
>> 
>> Neither interface ICompilationUnit, nor IPackageDeclaration have method resolveType(String) which is needed to resolve 'Named' into 'javax.inject.Named'. I could not find a better solution than creating a temporary IType. It is never added to the actual Java model of the project, it exists only in a working copy that is discarded.
>> 
>> Java model listeners may get the event on creating this type, but they also should get the event on its discarding. 
>> 
>> Best regards,
>> Slava
>> 
>> On 07/31/2012 06:34 AM, Xavier Coulon wrote:
>>> 
>>> Hello Daniel,
>>> 
>>> As I'm trying to fix https://issues.jboss.org/browse/JBIDE-12095, I found something a bit strange in the CDIBuilderDelegate when editing a 'package-info.java' file (just adding a space char):
>>> At line 90, the CDIBuilderDelegate#build() method calls the PackageDelegate#setPackage() method below which creates a 'class A {}' as shown below.
>>> 
>>>  public void setPackage(IPackageDeclaration pkg, IRootDefinitionContext context) {
>>>  qualifiedName = pkg.getElementName();
>>>  IType contextType = null;
>>>  ICompilationUnit u = null;
>>>  if(pkg.getParent() instanceof ICompilationUnit) {
>>>  try {
>>>  u = ((ICompilationUnit)pkg.getParent()).getWorkingCopy(new NullProgressMonitor());
>>>  contextType = u.createType("class A {}", null, false, new NullProgressMonitor());
>>>  } catch (JavaModelException e) {
>>>  
>>>  }
>>>  }
>>>  super.setAnnotatable(pkg, contextType, context, 0);
>>>  if (u != null) {
>>>  try {
>>>  u.discardWorkingCopy();
>>>  } catch (JavaModelException e) {
>>>  
>>>  }
>>>  }
>>>  } 
>>> 
>>> The JAX-RS plugin catches an event for this type creation but fails later. I can add some tests to verify that the type really exist, but still, is this necessary (just asking, don't take is bad) ?
>>> 
>>> Thanks.
>>> Best regards,
>>> /Xavier
>>> 
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> jbosstools-dev mailing list
>>> jbosstools-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/jbosstools-dev
>> 
>> 
>> 
>> _______________________________________________
>> jbosstools-dev mailing list
>> jbosstools-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/jbosstools-dev
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jbosstools-dev/attachments/20120801/4c860000/attachment-0001.html 


More information about the jbosstools-dev mailing list