[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