http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/mixins/inspections/MixinsAnnotationDeclaredOnMixinType.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/mixins/inspections/MixinsAnnotationDeclaredOnMixinType.java b/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/mixins/inspections/MixinsAnnotationDeclaredOnMixinType.java new file mode 100644 index 0000000..914823d --- /dev/null +++ b/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/mixins/inspections/MixinsAnnotationDeclaredOnMixinType.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +package org.apache.polygene.ide.plugin.idea.mixins.inspections; + +import com.intellij.codeInspection.InspectionManager; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiAnnotationMemberValue; +import com.intellij.psi.PsiClass; +import org.jetbrains.annotations.NotNull; +import org.apache.polygene.ide.plugin.idea.common.inspections.AbstractFix; +import org.apache.polygene.ide.plugin.idea.common.inspections.AbstractInspection; + +import static com.intellij.codeInspection.ProblemHighlightType.GENERIC_ERROR_OR_WARNING; +import static org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle.message; +import static org.apache.polygene.ide.plugin.idea.mixins.common.PolygeneMixinUtil.getMixinsAnnotation; + +/** + * @author [email protected] + * @since 0.1 + */ +public final class MixinsAnnotationDeclaredOnMixinType extends AbstractInspection +{ + @NotNull + public final String getShortName() + { + return "MixinsAnnotationDeclaredOnMixinType"; + } + + @NotNull + protected final String resourceBundlePrefixId() + { + return "mixins.annotation.declared.on.mixin.type"; + } + + @Override + public ProblemDescriptor[] checkClass( @NotNull PsiClass psiClass, + @NotNull InspectionManager manager, + boolean isOnTheFly ) + { + PsiAnnotation mixinsAnnotation = getMixinsAnnotation( psiClass ); + if( mixinsAnnotation == null ) + { + return null; + } + + if( psiClass.isInterface() ) + { + return null; + } + + String message = message( "mixins.annotation.declared.on.mixin.type.error.declared.on.class" ); + RemoveInvalidMixinClassReferenceFix fix = new RemoveInvalidMixinClassReferenceFix( mixinsAnnotation ); + ProblemDescriptor problemDescriptor = manager.createProblemDescriptor( mixinsAnnotation, message, fix, + GENERIC_ERROR_OR_WARNING ); + return new ProblemDescriptor[]{ problemDescriptor }; + + } + + private static class RemoveInvalidMixinClassReferenceFix extends AbstractFix + { + private final PsiAnnotationMemberValue mixinsAnnotation; + + public RemoveInvalidMixinClassReferenceFix( @NotNull PsiAnnotationMemberValue mixinsAnnotation ) + { + super( message( "mixins.annotation.declared.on.mixin.type.fix.remove.mixins.annotation" ) ); + this.mixinsAnnotation = mixinsAnnotation; + } + + public final void applyFix( @NotNull Project project, @NotNull ProblemDescriptor descriptor ) + { + mixinsAnnotation.delete(); + } + } +}
http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/common/PolygeneSideEffectConstants.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/common/PolygeneSideEffectConstants.java b/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/common/PolygeneSideEffectConstants.java new file mode 100644 index 0000000..d3c269f --- /dev/null +++ b/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/common/PolygeneSideEffectConstants.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +package org.apache.polygene.ide.plugin.idea.sideEffects.common; + +/** + * @author [email protected] + * @since 0.1 + */ +public final class PolygeneSideEffectConstants +{ + public static final String QUALIFIED_NAME_SIDE_EFFECTS = "org.apache.polygene.api.sideeffect.SideEffects"; + + public static final String QUALIFIED_NAME_SIDE_EFFECT_OF = "org.apache.polygene.api.sideeffect.SideEffectOf"; + public static final String QUALIFIED_NAME_GENERIC_SIDE_EFFECT = "org.apache.polygene.api.sideeffect.GenericSideEffect"; + + private PolygeneSideEffectConstants() + { + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/common/PolygeneSideEffectUtil.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/common/PolygeneSideEffectUtil.java b/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/common/PolygeneSideEffectUtil.java new file mode 100644 index 0000000..c1533fc --- /dev/null +++ b/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/common/PolygeneSideEffectUtil.java @@ -0,0 +1,188 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +package org.apache.polygene.ide.plugin.idea.sideEffects.common; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +import static com.intellij.codeInsight.AnnotationUtil.findAnnotation; +import static java.util.Collections.emptyList; +import static org.apache.polygene.ide.plugin.idea.common.psi.PsiAnnotationUtil.getAnnotationDefaultParameterValue; +import static org.apache.polygene.ide.plugin.idea.common.psi.PsiAnnotationUtil.getClassReference; +import static org.apache.polygene.ide.plugin.idea.common.psi.PsiClassUtil.getPSIClass; +import static org.apache.polygene.ide.plugin.idea.common.psi.search.GlobalSearchScopeUtil.determineSearchScope; +import static org.apache.polygene.ide.plugin.idea.sideEffects.common.PolygeneSideEffectConstants.*; + +/** + * @author [email protected] + * @since 0.1 + */ +public final class PolygeneSideEffectUtil +{ + /** + * @param searchContext Search context. + * @return {@code GenericSideEffect} class given the search context. {@code null} if not found. + * @since 0.1 + */ + @Nullable + public static PsiClass getGenericSideEffectClass( @NotNull PsiElement searchContext ) + { + Project project = searchContext.getProject(); + GlobalSearchScope searchScope = determineSearchScope( searchContext ); + return getGenericSideEffectClass( project, searchScope ); + } + + /** + * @param project project. + * @param scope search scope. + * @return {@code GenericSideEffect} class given {@code project} and {@code scope} parameters. + * Returns {@code null} if not found. + * @since 0.1 + */ + @Nullable + public static PsiClass getGenericSideEffectClass( @NotNull Project project, + @Nullable GlobalSearchScope scope ) + { + JavaPsiFacade psiFacade = JavaPsiFacade.getInstance( project ); + return scope == null ? null : psiFacade.findClass( QUALIFIED_NAME_GENERIC_SIDE_EFFECT, scope ); + } + + /** + * @param searchContext Search context. + * @return {@code SideEffectOf} class given the search context. {@code null} if not found. + * @since 0.1 + */ + @Nullable + public static PsiClass getSideEffectOfClass( @NotNull PsiElement searchContext ) + { + Project project = searchContext.getProject(); + GlobalSearchScope searchScope = determineSearchScope( searchContext ); + return getSideEffectOfClass( project, searchScope ); + } + + + /** + * @param project project. + * @param scope search scope. + * @return {@code SideEffectOf} class given {@code project} and {@code scope} parameters. + * Returns {@code null} if not found. + * @since 0.1 + */ + @Nullable + public static PsiClass getSideEffectOfClass( @NotNull Project project, + @Nullable GlobalSearchScope scope ) + { + JavaPsiFacade psiFacade = JavaPsiFacade.getInstance( project ); + return scope == null ? null : psiFacade.findClass( QUALIFIED_NAME_SIDE_EFFECT_OF, scope ); + } + + /** + * @param elementWithinJavaClass element within java class. + * @return {@code @SideEffects} annotation declaration of the class that contains the element. + * Returns {@code null} if not found, or {@code element} is an invalid context. + * @since 0.1 + */ + @Nullable + public static PsiAnnotation getSideEffectsAnnotation( @NotNull PsiElement elementWithinJavaClass ) + { + PsiClass psiClass = getPSIClass( elementWithinJavaClass ); + return findAnnotation( psiClass, QUALIFIED_NAME_SIDE_EFFECTS ); + } + + /** + * @param annotation annotation to process. + * @return {@code @SideEffects} annotation value. Returns {@link Collections#emptyList()} if {@code annotation} is + * {@code null} or annotation is not a {@code @SideEffects} annotation. + * @since 0.1 + */ + @NotNull + public static List<PsiAnnotationMemberValue> getSideEffectsAnnotationValue( @Nullable PsiAnnotation annotation ) + { + if( annotation == null ) + { + return emptyList(); + } + + String concernsQualifiedName = annotation.getQualifiedName(); + if( !QUALIFIED_NAME_SIDE_EFFECTS.equals( concernsQualifiedName ) ) + { + return emptyList(); + } + + return getAnnotationDefaultParameterValue( annotation ); + } + + /** + * @param value annotation member value. + * @return Side effect class reference given the {@code value} parameter. Returns {@code null} if it's not a + * class reference. + * @since 0.1 + */ + @Nullable + public static PsiJavaCodeReferenceElement getSideEffectClassReference( @NotNull PsiAnnotationMemberValue value ) + { + return getClassReference( value ); + } + + /** + * Returns a {@code boolean} indicator whether the specified {@code psiClass} is a side effect. + * + * @param psiClass class to check. + * @return {@code true} if {@code psiClass} is a side effect, {@code false} otherwise. + * @since 0.1 + */ + public static boolean isASideEffect( @NotNull PsiClass psiClass ) + { + if( psiClass.isInterface() ) + { + return false; + } + + PsiClass sideEffectOfClass = getSideEffectOfClass( psiClass ); + return sideEffectOfClass != null && psiClass.isInheritor( sideEffectOfClass, true ); + } + + /** + * @param psiClass psi class to check. + * @return {@code true} if {@code psiClass} inherits {@code GenericSideEffect} class, {@code false} if + * {@code psiClass} does + * not inherit {@code GenericSideEffect} or {@code GenericSideEffect} is not found. + * @since 0.1 + */ + public static boolean isAGenericSideEffect( @NotNull PsiClass psiClass ) + { + if( psiClass.isInterface() ) + { + return false; + } + + PsiClass genericSideEffect = getGenericSideEffectClass( psiClass ); + return genericSideEffect != null && psiClass.isInheritor( genericSideEffect, true ); + } + + private PolygeneSideEffectUtil() + { + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/inspections/SideEffectsAnnotationDeclaredCorrectlyInspection.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/inspections/SideEffectsAnnotationDeclaredCorrectlyInspection.java b/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/inspections/SideEffectsAnnotationDeclaredCorrectlyInspection.java new file mode 100644 index 0000000..bf46eb3 --- /dev/null +++ b/tools/qidea/src/main/java/org/apache/polygene/ide/plugin/idea/sideEffects/inspections/SideEffectsAnnotationDeclaredCorrectlyInspection.java @@ -0,0 +1,177 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +package org.apache.polygene.ide.plugin.idea.sideEffects.inspections; + +import com.intellij.codeInspection.InspectionManager; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiAnnotationMemberValue; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiJavaCodeReferenceElement; +import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NotNull; +import org.apache.polygene.ide.plugin.idea.common.inspections.AbstractFix; +import org.apache.polygene.ide.plugin.idea.common.inspections.AbstractInspection; +import org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle; +import org.apache.polygene.ide.plugin.idea.sideEffects.common.PolygeneSideEffectUtil; + +import java.util.LinkedList; +import java.util.List; + +import static com.intellij.codeInspection.ProblemHighlightType.GENERIC_ERROR_OR_WARNING; +import static org.apache.polygene.ide.plugin.idea.common.psi.search.GlobalSearchScopeUtil.determineSearchScope; +import static org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle.message; +import static org.apache.polygene.ide.plugin.idea.sideEffects.common.PolygeneSideEffectUtil.*; + +/** + * @author [email protected] + * @since 0.1 + */ +public final class SideEffectsAnnotationDeclaredCorrectlyInspection extends AbstractInspection +{ + @NotNull + protected final String resourceBundlePrefixId() + { + return "side.effects.annotation.declared.correctly"; + } + + @NotNull + public final String getShortName() + { + return "SideEffectsAnnotationDeclaredCorrectlyInspection"; + } + + @Override + public final ProblemDescriptor[] checkClass( @NotNull PsiClass psiClass, + @NotNull InspectionManager manager, + boolean isOnTheFly ) + { + // If class does not have @SideEffects, ignore + PsiAnnotation sideEffectsAnnotation = getSideEffectsAnnotation( psiClass ); + if( sideEffectsAnnotation == null ) + { + return null; + } + + // If @SideEffects declared in class, suggest remove @SideEffects annotation + if( !psiClass.isInterface() ) + { + String message = message( "side.effects.annotation.declared.correctly.error.annotation.declared.in.class" ); + RemoveSideEffectsAnnotationFix fix = new RemoveSideEffectsAnnotationFix( sideEffectsAnnotation ); + ProblemDescriptor problemDescriptor = manager.createProblemDescriptor( sideEffectsAnnotation, message, fix, + GENERIC_ERROR_OR_WARNING ); + return new ProblemDescriptor[]{ problemDescriptor }; + } + + // If @SideEffects annotation is empty, ignore + List<PsiAnnotationMemberValue> sideEffectsAnnotationValue = + getSideEffectsAnnotationValue( sideEffectsAnnotation ); + if( sideEffectsAnnotationValue.isEmpty() ) + { + return null; + } + + // If SideEffectOf is not resolved, ignore + Project project = psiClass.getProject(); + GlobalSearchScope searchScope = determineSearchScope( psiClass ); + PsiClass sideEffectOfClass = PolygeneSideEffectUtil.getGenericSideEffectClass( project, searchScope ); + if( sideEffectOfClass == null ) + { + return null; + } + + List<ProblemDescriptor> problems = new LinkedList<ProblemDescriptor>(); + for( PsiAnnotationMemberValue sideEffectClassReferenceWrapper : sideEffectsAnnotationValue ) + { + PsiJavaCodeReferenceElement sideEffectClassReference = + getSideEffectClassReference( sideEffectClassReferenceWrapper ); + + // If it's not a class reference, ignore + if( sideEffectClassReference == null ) + { + continue; + } + + // If class reference can't be resolved, ignore + PsiClass sideEffectClass = (PsiClass) sideEffectClassReference.resolve(); + if( sideEffectClass == null ) + { + continue; + } + + // If side effect class does not inherit SideEffectOf class, suggest remove that reference. + if( !sideEffectClass.isInheritor( sideEffectOfClass, true ) ) + { + String message = PolygeneResourceBundle.message( + "side.effects.annotation.declared.correctly.error.side.effect.does.not.extend.side.effect.of", + sideEffectClass.getQualifiedName() + ); + + RemoveAnnotationValueFix fix = new RemoveAnnotationValueFix( + sideEffectClassReferenceWrapper, sideEffectClassReference + ); + ProblemDescriptor problemDescriptor = manager.createProblemDescriptor( + sideEffectClassReferenceWrapper, message, fix, GENERIC_ERROR_OR_WARNING ); + problems.add( problemDescriptor ); + } + else + { + // TODO: Test whether it is a generic side effect + // TODO: Test whether it is a specific side effect + } + } + + return problems.toArray( new ProblemDescriptor[problems.size()] ); + } + + private static class RemoveSideEffectsAnnotationFix extends AbstractFix + { + private final PsiAnnotation sideEffectsAnnotation; + + private RemoveSideEffectsAnnotationFix( @NotNull PsiAnnotation sideEffectsAnnotation ) + { + super( message( "side.effects.annotation.declared.correctly.fix.remove.annotation" ) ); + this.sideEffectsAnnotation = sideEffectsAnnotation; + } + + public final void applyFix( @NotNull Project project, @NotNull ProblemDescriptor descriptor ) + { + sideEffectsAnnotation.delete(); + } + } + + private static class RemoveAnnotationValueFix extends AbstractFix + { + private final PsiAnnotationMemberValue annotationValueToRemove; + + private RemoveAnnotationValueFix( @NotNull PsiAnnotationMemberValue annotationValueToRemove, + @NotNull PsiJavaCodeReferenceElement sideEffectClassReference ) + { + super( message( "side.effects.annotation.declared.correctly.fix.remove.class.reference", + sideEffectClassReference.getQualifiedName() ) ); + this.annotationValueToRemove = annotationValueToRemove; + } + + public final void applyFix( @NotNull Project project, @NotNull ProblemDescriptor descriptor ) + { + annotationValueToRemove.delete(); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/PolygeneApplicationComponent.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/PolygeneApplicationComponent.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/PolygeneApplicationComponent.java deleted file mode 100644 index 42d1104..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/PolygeneApplicationComponent.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea; - -import com.intellij.codeInspection.InspectionToolProvider; -import com.intellij.facet.FacetTypeRegistry; -import com.intellij.ide.fileTemplates.FileTemplateDescriptor; -import com.intellij.ide.fileTemplates.FileTemplateGroupDescriptor; -import com.intellij.ide.fileTemplates.FileTemplateGroupDescriptorFactory; -import com.intellij.openapi.components.ApplicationComponent; -import com.intellij.openapi.fileTypes.FileTypeManager; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.apache.polygene.ide.plugin.idea.appliesTo.inspections.AppliesToAnnotationDeclaredCorrectlyInspection; -import org.apache.polygene.ide.plugin.idea.common.facet.PolygeneFacetType; -import org.apache.polygene.ide.plugin.idea.concerns.inspections.ConcernsAnnotationDeclaredCorrectlyInspection; -import org.apache.polygene.ide.plugin.idea.injections.invocation.inspections.InvocationAnnotationDeclaredCorrectlyInspection; -import org.apache.polygene.ide.plugin.idea.injections.service.inspections.ServiceAnnotationDeclaredCorrectlyInspection; -import org.apache.polygene.ide.plugin.idea.injections.structure.inspections.StructureAnnotationDeclaredCorrectlyInspection; -import org.apache.polygene.ide.plugin.idea.mixins.inspections.MixinImplementsMixinType; -import org.apache.polygene.ide.plugin.idea.mixins.inspections.MixinsAnnotationDeclaredOnMixinType; -import org.apache.polygene.ide.plugin.idea.sideEffects.inspections.SideEffectsAnnotationDeclaredCorrectlyInspection; - -import javax.swing.*; - -import static org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle.message; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class PolygeneApplicationComponent - implements ApplicationComponent, InspectionToolProvider, FileTemplateGroupDescriptorFactory -{ - @NonNls - private static String[] FILE_TEMPLATES = { - "GenericConcernOf.java" - }; - - private final PolygeneFacetType polygeneFacetType; - - public PolygeneApplicationComponent() - { - polygeneFacetType = new PolygeneFacetType(); - } - - @NotNull - public final String getComponentName() - { - return "PolygeneApplicationComponent"; - } - - public final void initComponent() - { - registerFacet(); - registerIntentions(); - } - - private void registerFacet() - { - FacetTypeRegistry facetTypeRegistry = FacetTypeRegistry.getInstance(); - facetTypeRegistry.registerFacetType( polygeneFacetType ); - } - - private void registerIntentions() - { -// IntentionManager intentionManager = IntentionManager.getInstance(); -// intentionManager.registerIntentionAndMetaData( new AddConcernOnType(), "intention.category.control.flow" ); - } - - public final void disposeComponent() - { - unregisterFacet(); - } - - private void unregisterFacet() - { - FacetTypeRegistry facetTypeRegistry = FacetTypeRegistry.getInstance(); - facetTypeRegistry.unregisterFacetType( polygeneFacetType ); - } - - public final Class[] getInspectionClasses() - { - return new Class[]{ - // Concerns - ConcernsAnnotationDeclaredCorrectlyInspection.class, - // Mixins - MixinImplementsMixinType.class, - MixinsAnnotationDeclaredOnMixinType.class, - // Side effects - SideEffectsAnnotationDeclaredCorrectlyInspection.class, - // Injections - InvocationAnnotationDeclaredCorrectlyInspection.class, - ServiceAnnotationDeclaredCorrectlyInspection.class, - StructureAnnotationDeclaredCorrectlyInspection.class, - // AppliesTo - AppliesToAnnotationDeclaredCorrectlyInspection.class - }; - } - - public final FileTemplateGroupDescriptor getFileTemplatesDescriptor() - { - FileTemplateGroupDescriptor group = new FileTemplateGroupDescriptor( - message( "polygene.file.template.group.title" ), null - ); - - FileTypeManager fileTypeManager = FileTypeManager.getInstance(); - for( @NonNls String template : FILE_TEMPLATES ) - { - Icon icon = fileTypeManager.getFileTypeByFileName( template ).getIcon(); - group.addTemplate( new FileTemplateDescriptor( template, icon ) ); - } - - return group; - } - -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/common/PolygeneAppliesToConstants.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/common/PolygeneAppliesToConstants.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/common/PolygeneAppliesToConstants.java deleted file mode 100644 index e50589d..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/common/PolygeneAppliesToConstants.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.appliesTo.common; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class PolygeneAppliesToConstants -{ - public static final String QUALIFIED_NAME_APPLIES_TO = "org.apache.polygene.api.common.AppliesTo"; - public static final String QUALIFIED_NAME_APPLIES_TO_FILTER = "org.apache.polygene.api.common.AppliesToFilter"; - - private PolygeneAppliesToConstants() - { - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/common/PolygeneAppliesToUtil.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/common/PolygeneAppliesToUtil.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/common/PolygeneAppliesToUtil.java deleted file mode 100644 index fd56b6b..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/common/PolygeneAppliesToUtil.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.appliesTo.common; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.search.GlobalSearchScope; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.List; - -import static com.intellij.codeInsight.AnnotationUtil.findAnnotation; -import static java.util.Collections.emptyList; -import static org.apache.polygene.ide.plugin.idea.appliesTo.common.PolygeneAppliesToConstants.QUALIFIED_NAME_APPLIES_TO; -import static org.apache.polygene.ide.plugin.idea.appliesTo.common.PolygeneAppliesToConstants.QUALIFIED_NAME_APPLIES_TO_FILTER; -import static org.apache.polygene.ide.plugin.idea.common.psi.PsiAnnotationUtil.getAnnotationDefaultParameterValue; -import static org.apache.polygene.ide.plugin.idea.common.psi.PsiAnnotationUtil.getClassReference; -import static org.apache.polygene.ide.plugin.idea.common.psi.PsiClassUtil.getPSIClass; -import static org.apache.polygene.ide.plugin.idea.common.psi.search.GlobalSearchScopeUtil.determineSearchScope; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class PolygeneAppliesToUtil -{ - /** - * @param searchContext Search context. - * @return {@code AppliesToFilter} class given the search context. {@code null} if not found. - * @since 0.1 - */ - @Nullable - public static PsiClass getAppliesToFilterClass( @NotNull PsiElement searchContext ) - { - Project project = searchContext.getProject(); - GlobalSearchScope searchScope = determineSearchScope( searchContext ); - return getAppliesToFilterClass( project, searchScope ); - } - - /** - * @param project project. - * @param scope search scope. - * @return {@code AppliesToFilter} class given {@code project} and {@code scope} parameters. - * Returns {@code null} if not found. - * @since 0.1 - */ - @Nullable - public static PsiClass getAppliesToFilterClass( @NotNull Project project, - @Nullable GlobalSearchScope scope ) - { - JavaPsiFacade psiFacade = JavaPsiFacade.getInstance( project ); - return scope == null ? null : psiFacade.findClass( QUALIFIED_NAME_APPLIES_TO_FILTER, scope ); - } - - /** - * @param elementWithinJavaClass element within java class. - * @return {@code @AppliesTo} annotation declaration of the class that contains the element. - * Returns {@code null} if not found, or {@code element} is an invalid context. - * @since 0.1 - */ - @Nullable - public static PsiAnnotation getAppliesToAnnotation( @NotNull PsiElement elementWithinJavaClass ) - { - PsiClass psiClass = getPSIClass( elementWithinJavaClass ); - return findAnnotation( psiClass, QUALIFIED_NAME_APPLIES_TO ); - } - - /** - * @param annotation annotation to process. - * @return {@code @AppliesTo} annotation value. Returns {@link Collections#emptyList()} if {@code annotation} is - * {@code null} or annotation is not a {@code @AppliesTo} annotation. - * @since 0.1 - */ - @NotNull - public static List<PsiAnnotationMemberValue> getAppliesToAnnotationValue( @Nullable PsiAnnotation annotation ) - { - if( annotation == null ) - { - return emptyList(); - } - - String concernsQualifiedName = annotation.getQualifiedName(); - if( !QUALIFIED_NAME_APPLIES_TO.equals( concernsQualifiedName ) ) - { - return emptyList(); - } - - return getAnnotationDefaultParameterValue( annotation ); - } - - /** - * @param value annotation member value. - * @return Applies to class reference given the {@code value} parameter. Returns {@code null} if it's not a - * class reference. - * @since 0.1 - */ - @Nullable - public static PsiJavaCodeReferenceElement getAppliesToValueClassReference( @NotNull PsiAnnotationMemberValue value ) - { - return getClassReference( value ); - } - - /** - * Returns a {@code boolean} indicator whether the specified {@code psiClass} is implements - * {@code AppliesToFilter} class. - * - * @param psiClass class to check. - * @param appliesToFilterClass {@code AppliesToFilter} class. - * @return {@code true} if {@code psiClass} implements {@code AppliesToFilter} class, {@code false} otherwise. - * @since 0.1 - */ - public static boolean isAnAppliesToFilter( @NotNull PsiClass psiClass, @NotNull PsiClass appliesToFilterClass ) - { - return !psiClass.isInterface() && psiClass.isInheritor( appliesToFilterClass, true ); - } - - private PolygeneAppliesToUtil() - { - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/inspections/AppliesToAnnotationDeclaredCorrectlyInspection.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/inspections/AppliesToAnnotationDeclaredCorrectlyInspection.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/inspections/AppliesToAnnotationDeclaredCorrectlyInspection.java deleted file mode 100644 index b64d762..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/appliesTo/inspections/AppliesToAnnotationDeclaredCorrectlyInspection.java +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.appliesTo.inspections; - -import com.intellij.codeInspection.InspectionManager; -import com.intellij.codeInspection.ProblemDescriptor; -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.search.GlobalSearchScope; -import org.jetbrains.annotations.NotNull; -import org.apache.polygene.ide.plugin.idea.common.inspections.AbstractFix; -import org.apache.polygene.ide.plugin.idea.common.inspections.AbstractInspection; - -import java.util.LinkedList; -import java.util.List; - -import static com.intellij.codeInspection.ProblemHighlightType.GENERIC_ERROR_OR_WARNING; -import static org.apache.polygene.ide.plugin.idea.appliesTo.common.PolygeneAppliesToUtil.*; -import static org.apache.polygene.ide.plugin.idea.common.psi.PsiClassUtil.isImplementsInvocationHandler; -import static org.apache.polygene.ide.plugin.idea.common.psi.search.GlobalSearchScopeUtil.determineSearchScope; -import static org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle.message; -import static org.apache.polygene.ide.plugin.idea.concerns.common.PolygeneConcernUtil.isAConcern; -import static org.apache.polygene.ide.plugin.idea.concerns.common.PolygeneConcernUtil.isAGenericConcern; -import static org.apache.polygene.ide.plugin.idea.sideEffects.common.PolygeneSideEffectUtil.isAGenericSideEffect; -import static org.apache.polygene.ide.plugin.idea.sideEffects.common.PolygeneSideEffectUtil.isASideEffect; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class AppliesToAnnotationDeclaredCorrectlyInspection extends AbstractInspection -{ - @NotNull - protected final String resourceBundlePrefixId() - { - return "applies.to.annotation.declared.correctly"; - } - - @NotNull - public final String getShortName() - { - return "AppliesToAnnotationDeclaredCorrectlyInspection"; - } - - @Override - public final ProblemDescriptor[] checkClass( @NotNull PsiClass psiClass, - @NotNull InspectionManager manager, - boolean isOnTheFly ) - { - PsiAnnotation appliesToAnnotation = getAppliesToAnnotation( psiClass ); - if( appliesToAnnotation == null ) - { - // If class does not have @AppliesTo, ignore - return null; - } - - String classQualifiedName = psiClass.getQualifiedName(); - // @AppliesTo can only be declared on class - if( psiClass.isInterface() ) - { - // Suggest remove applies to - String message = message( - "applies.to.annotation.declared.correctly.error.annotation.must.be.declared.on.class" - ); - ProblemDescriptor problemDescriptor = createRemoveAppliesToFilterProblemDescriptor( - manager, message, appliesToAnnotation ); - return new ProblemDescriptor[]{ problemDescriptor }; - } - - // If @AppliesTo annotation is empty, ignore - List<PsiAnnotationMemberValue> appliesToAnnotationValues = getAppliesToAnnotationValue( appliesToAnnotation ); - if( appliesToAnnotationValues.isEmpty() ) - { - return null; - } - - // If AppliesToFilter is not resolved, ignore - Project project = psiClass.getProject(); - GlobalSearchScope searchScope = determineSearchScope( psiClass ); - PsiClass appliesToFilterClass = getAppliesToFilterClass( project, searchScope ); - if( appliesToFilterClass == null ) - { - return null; - } - - boolean classIsAConcern = isAConcern( psiClass ); - boolean classIsASideEffect = isASideEffect( psiClass ); - boolean classIsAGenericConcern = classIsAConcern && isAGenericConcern( psiClass ); - boolean classIsAGenericSideEffect = classIsASideEffect && isAGenericSideEffect( psiClass ); - boolean classIsAMixin = !classIsAConcern && !classIsASideEffect; - boolean classIsAGenericMixin = classIsAMixin && isImplementsInvocationHandler( psiClass ); - - List<ProblemDescriptor> problems = new LinkedList<ProblemDescriptor>(); - for( PsiAnnotationMemberValue appliesToAnnotationValue : appliesToAnnotationValues ) - { - PsiJavaCodeReferenceElement appliesToValueClassReference = - getAppliesToValueClassReference( appliesToAnnotationValue ); - - // If it's not a class reference, ignore - if( appliesToValueClassReference == null ) - { - continue; - } - - // If class reference can't be resolved, ignore - PsiClass appliesToValueClass = (PsiClass) appliesToValueClassReference.resolve(); - if( appliesToValueClass == null ) - { - continue; - } - - String appliesToValueQualifiedName = appliesToValueClass.getQualifiedName(); - boolean appliesToValueIsAnAnnotation = appliesToValueClass.isAnnotationType(); - boolean appliesToValueIsImplementingAppliesToFilter = - appliesToValueClass.isInheritor( appliesToFilterClass, true ); - - String message = null; - if( appliesToValueIsAnAnnotation && classIsAMixin ) - { - // If Class is a mixin and appliesToValueClass is an annotation - message = message( - "applies.to.annotation.declared.correctly.error.value.is.invalid.for.mixin", - appliesToValueQualifiedName - ); - } - else if( appliesToValueIsAnAnnotation || appliesToValueIsImplementingAppliesToFilter ) - { - if( classIsAConcern && !classIsAGenericConcern ) - { - // If psiClass is a concern but not generic concern - message = message( - "applies.to.annotation.declared.correctly.error.value.requires.class.to.extends.GenericConcern", - appliesToValueQualifiedName, classQualifiedName - ); - } - else if( classIsASideEffect && !classIsAGenericSideEffect ) - { - // If psiClass a side effect but not a generic side effect - message = message( - "applies.to.annotation.declared.correctly.error.value.requires.class.to.extends.GenericSideEffect", - appliesToValueQualifiedName, classQualifiedName - ); - } - else if( appliesToValueIsImplementingAppliesToFilter && !classIsAGenericMixin ) - { - message = message( - "applies.to.annotation.declared.correctly.error.value.requires.class.to.implements.InvocationHandler", - appliesToValueQualifiedName, classQualifiedName - ); - } - } - else if( appliesToValueClass.isInterface() ) - { - if( !psiClass.isInheritor( appliesToValueClass, true ) && - !( classIsAGenericConcern || classIsAGenericSideEffect ) ) - { - // If psiClass does not implement that interface and it's not a generic concern or generic side effect - if( classIsAConcern ) - { - message = message( - "applies.to.annotation.declared.correctly.error.value.requires.class.to.implement.interface.or.extends.GenericConcern", - appliesToValueQualifiedName, classQualifiedName ); - } - else if( classIsASideEffect ) - { - message = message( - "applies.to.annotation.declared.correctly.error.value.requires.class.to.implement.interface.or.extends.GenericSideEffect", - appliesToValueQualifiedName, classQualifiedName ); - } - else - { - message = message( - "applies.to.annotation.declared.correctly.error.value.requires.class.to.implement.value.interface.or.implements.InvocationHandler", - appliesToValueQualifiedName, classQualifiedName ); - } - } - } - else - { - if( classIsAMixin ) - { - message = message( - "applies.to.annotation.declared.correctly.error.value.is.invalid.for.mixin", - appliesToValueQualifiedName - ); - } - else - { - message = message( - "applies.to.annotation.declared.correctly.error.annotation.value.is.invalid.for.non.mixin", - appliesToValueQualifiedName - ); - } - } - - if( message != null ) - { - ProblemDescriptor problemDescriptor = manager.createProblemDescriptor( - appliesToAnnotationValue, - message, - new RemoveAnnotationValueFix( appliesToAnnotationValue, appliesToValueClassReference ), - GENERIC_ERROR_OR_WARNING ); - problems.add( problemDescriptor ); - } - } - - return problems.toArray( new ProblemDescriptor[problems.size()] ); - } - - @NotNull - private ProblemDescriptor createRemoveAppliesToFilterProblemDescriptor( @NotNull InspectionManager manager, - @NotNull String problemMessage, - @NotNull PsiAnnotation appliesToAnnotation ) - { - RemoveAppliesToFilterAnnotationFix fix = new RemoveAppliesToFilterAnnotationFix( appliesToAnnotation ); - return manager.createProblemDescriptor( appliesToAnnotation, problemMessage, fix, GENERIC_ERROR_OR_WARNING ); - } - - private static class RemoveAppliesToFilterAnnotationFix extends AbstractFix - { - private final PsiAnnotation appliesToFilterAnnotation; - - private RemoveAppliesToFilterAnnotationFix( @NotNull PsiAnnotation appliesToFilterAnnotation ) - { - super( message( "applies.to.annotation.declared.correctly.fix.remove.annotation" ) ); - this.appliesToFilterAnnotation = appliesToFilterAnnotation; - } - - public final void applyFix( @NotNull Project project, @NotNull ProblemDescriptor descriptor ) - { - appliesToFilterAnnotation.delete(); - } - } - - private static class RemoveAnnotationValueFix extends AbstractFix - { - private final PsiAnnotationMemberValue annotationValueToRemove; - - private RemoveAnnotationValueFix( @NotNull PsiAnnotationMemberValue annotationValueToRemove, - @NotNull PsiJavaCodeReferenceElement appliesToValueClassReference ) - { - super( message( "applies.to.annotation.declared.correctly.fix.remove.class.reference", - appliesToValueClassReference.getQualifiedName() ) ); - this.annotationValueToRemove = annotationValueToRemove; - } - - public final void applyFix( @NotNull Project project, @NotNull ProblemDescriptor descriptor ) - { - annotationValueToRemove.delete(); - } - } - - private static class ClassImplementInterfaceFix extends AbstractFix - { - private final PsiClass psiClass; - private final PsiClass interfaceToImplement; - - private ClassImplementInterfaceFix( @NotNull PsiClass psiClass, - @NotNull PsiClass interfaceToImplement ) - { - super( message( "applies.to.annotation.declared.correctly.fix.remove.class.reference", - interfaceToImplement.getQualifiedName() ) ); - this.psiClass = psiClass; - this.interfaceToImplement = interfaceToImplement; - } - - public final void applyFix( @NotNull Project project, @NotNull ProblemDescriptor descriptor ) - { - PsiReferenceList implementList = psiClass.getImplementsList(); - if( implementList != null ) - { - - implementList.add( interfaceToImplement ); - } - } - } - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/actions/AbstractCreateElementActionBase.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/actions/AbstractCreateElementActionBase.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/actions/AbstractCreateElementActionBase.java deleted file mode 100644 index b47a045..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/actions/AbstractCreateElementActionBase.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.actions; - -import com.intellij.CommonBundle; -import com.intellij.ide.actions.CreateElementActionBase; -import com.intellij.ide.fileTemplates.FileTemplate; -import com.intellij.ide.fileTemplates.FileTemplateManager; -import com.intellij.ide.fileTemplates.JavaTemplateUtil; -import com.intellij.openapi.fileTypes.StdFileTypes; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.Messages; -import com.intellij.psi.*; -import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; - -import java.util.Properties; - -/** - * @author [email protected] - * @since 0.1 - */ -public abstract class AbstractCreateElementActionBase extends CreateElementActionBase -{ - @NonNls - private static final String NAME_TEMPLATE_PROPERTY = "NAME"; - - protected AbstractCreateElementActionBase( String text, String description ) - { - super( text, description, null ); - } - - @NotNull - protected final PsiElement[] invokeDialog( Project project, PsiDirectory directory ) - { - Module module = ModuleUtil.findModuleForFile( directory.getVirtualFile(), project ); - if( module == null ) - { - return PsiElement.EMPTY_ARRAY; - } - - MyInputValidator validator = doInvokeDialog( project, directory ); - return validator.getCreatedElements(); - } - - protected MyInputValidator doInvokeDialog( Project project, PsiDirectory directory ) - { - MyInputValidator validator = new MyInputValidator( project, directory ); - Messages.showInputDialog( project, getDialogPrompt(), getDialogTitle(), Messages.getQuestionIcon(), "", validator ); - return validator; - } - - /** - * @return Dialog prompt. - */ - protected abstract String getDialogPrompt(); - - /** - * @return Dialog title. - */ - protected abstract String getDialogTitle(); - - protected String getErrorTitle() - { - return CommonBundle.getErrorTitle(); - } - - protected final void checkBeforeCreate( String newName, PsiDirectory directory ) - throws IncorrectOperationException - { - JavaDirectoryService javaDirectoryService = JavaDirectoryService.getInstance(); - javaDirectoryService.checkCreateClass( directory, newName ); - } - - protected static PsiClass createClassFromTemplate( @NotNull PsiDirectory directory, - @NotNull String className, - @NotNull String templateName, - @NonNls String... parameters ) - throws IncorrectOperationException - { - String classFileName = className + "." + StdFileTypes.JAVA.getDefaultExtension(); - PsiFile file = createFromTemplateInternal( directory, className, classFileName, templateName, parameters ); - return ( (PsiJavaFile) file ).getClasses()[ 0 ]; - } - - protected static PsiFile createFromTemplateInternal( @NotNull PsiDirectory directory, - @NotNull String name, - @NotNull String fileName, - @NotNull String templateName, - @NonNls String... parameters ) - throws IncorrectOperationException - { - // Load template - FileTemplateManager fileTemplateManager = FileTemplateManager.getInstance(); - FileTemplate template = fileTemplateManager.getJ2eeTemplate( templateName ); - - // Process template properties - Properties properties = new Properties( fileTemplateManager.getDefaultProperties() ); - JavaTemplateUtil.setPackageNameAttribute( properties, directory ); - properties.setProperty( NAME_TEMPLATE_PROPERTY, name ); - - // Add parameters - for( int i = 0; i < parameters.length; i += 2 ) - { - properties.setProperty( parameters[ i ], parameters[ i + 1 ] ); - } - - // Create text from template with specified properties - String text; - try - { - text = template.getText( properties ); - } - catch( Exception e ) - { - String message = "Unable to load template for " + - fileTemplateManager.internalTemplateToSubject( templateName ); - throw new RuntimeException( message, e ); - } - - // Serialized text to file - PsiManager psiManager = PsiManager.getInstance( directory.getProject() ); - PsiFileFactory fileFactory = PsiFileFactory.getInstance( directory.getProject() ); - PsiFile file = fileFactory.createFileFromText( fileName, text ); - - // Reformat the file according to project/default style - CodeStyleManager codeStyleManager = CodeStyleManager.getInstance( psiManager ); - codeStyleManager.reformat( file ); - - // Add newly created file to directory - return (PsiFile) directory.add( file ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/actions/PolygeneCreateActionGroup.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/actions/PolygeneCreateActionGroup.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/actions/PolygeneCreateActionGroup.java deleted file mode 100644 index d53e0e1..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/actions/PolygeneCreateActionGroup.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.actions; - -import com.intellij.ide.IdeView; -import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.psi.JavaDirectoryService; -import com.intellij.psi.PsiDirectory; - -import static org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle.message; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class PolygeneCreateActionGroup extends DefaultActionGroup -{ - public PolygeneCreateActionGroup() - { - super( message( "polygene.action.group.title" ), true ); - getTemplatePresentation().setDescription( message( "polygene.action.group.description" ) ); - } - - public void update( AnActionEvent e ) - { - Presentation presentation = e.getPresentation(); - presentation.setVisible( shouldActionGroupVisible( e ) ); - } - - private boolean shouldActionGroupVisible( AnActionEvent e ) - { - Module module = e.getData( LangDataKeys.MODULE ); - if( module == null ) - { - return false; - } - - // TODO: Enable this once PolygeneFacet can be automatically added/removed -// if( PolygeneFacet.getInstance( module ) == null ) -// { -// return false; -// } - - // Are we on IDE View and under project source folder? - Project project = e.getData( PlatformDataKeys.PROJECT ); - IdeView view = e.getData( LangDataKeys.IDE_VIEW ); - if( view != null && project != null ) - { - ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance( project ).getFileIndex(); - PsiDirectory[] dirs = view.getDirectories(); - for( PsiDirectory dir : dirs ) - { - if( projectFileIndex.isInSourceContent( dir.getVirtualFile() ) && JavaDirectoryService.getInstance().getPackage( dir ) != null ) - { - return true; - } - } - } - - return false; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacet.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacet.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacet.java deleted file mode 100644 index 7342707..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacet.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.facet; - -import com.intellij.facet.Facet; -import com.intellij.facet.FacetManager; -import com.intellij.facet.FacetType; -import com.intellij.openapi.module.Module; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class PolygeneFacet extends Facet<PolygeneFacetConfiguration> -{ - public PolygeneFacet( @NotNull FacetType facetType, - @NotNull Module module, - String name, - @NotNull PolygeneFacetConfiguration configuration, - Facet underlyingFacet - ) - { - super( facetType, module, name, configuration, underlyingFacet ); - } - - @Nullable - public static PolygeneFacet getInstance( @NotNull Module module ) - { - return FacetManager.getInstance( module ).getFacetByType( PolygeneFacetType.ID ); - } - -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacetConfiguration.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacetConfiguration.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacetConfiguration.java deleted file mode 100644 index 6a6f28e..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacetConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.facet; - -import com.intellij.facet.FacetConfiguration; -import com.intellij.facet.ui.FacetEditorContext; -import com.intellij.facet.ui.FacetEditorTab; -import com.intellij.facet.ui.FacetValidatorsManager; -import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.WriteExternalException; -import org.jdom.Element; -import org.apache.polygene.ide.plugin.idea.common.facet.ui.PolygeneFacetEditorTab; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class PolygeneFacetConfiguration - implements FacetConfiguration -{ - public FacetEditorTab[] createEditorTabs( FacetEditorContext editorContext, - FacetValidatorsManager validatorsManager ) - { - return new FacetEditorTab[]{ - new PolygeneFacetEditorTab( editorContext ) - }; - } - - public final void readExternal( Element element ) - throws InvalidDataException - { - // Do nothing - } - - public final void writeExternal( Element element ) - throws WriteExternalException - { - // Do nothing - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacetType.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacetType.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacetType.java deleted file mode 100644 index b45de9f..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/PolygeneFacetType.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.facet; - -import com.intellij.facet.Facet; -import com.intellij.facet.FacetType; -import com.intellij.facet.FacetTypeId; -import com.intellij.facet.autodetecting.FacetDetector; -import com.intellij.facet.autodetecting.FacetDetectorRegistry; -import com.intellij.openapi.fileTypes.StdFileTypes; -import com.intellij.openapi.module.JavaModuleType; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleType; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.vfs.VirtualFileFilter; -import com.intellij.psi.JavaElementVisitor; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiImportStatement; -import com.intellij.psi.PsiReferenceExpression; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class PolygeneFacetType extends FacetType<PolygeneFacet, PolygeneFacetConfiguration> -{ - public static final FacetTypeId<PolygeneFacet> ID = new FacetTypeId<PolygeneFacet>(); - - public PolygeneFacetType() - { - super( ID, "PolygeneFacet", "Polygene Facet" ); - } - - public final PolygeneFacetConfiguration createDefaultConfiguration() - { - return new PolygeneFacetConfiguration(); - } - - public final PolygeneFacet createFacet( @NotNull Module module, - String name, - @NotNull PolygeneFacetConfiguration configuration, - @Nullable Facet underlyingFacet ) - { - return new PolygeneFacet( this, module, name, configuration, underlyingFacet ); - } - - public final boolean isSuitableModuleType( ModuleType moduleType ) - { - return moduleType instanceof JavaModuleType; - } - - @Override - public final void registerDetectors( FacetDetectorRegistry<PolygeneFacetConfiguration> registry ) - { - registry.registerOnTheFlyDetector( - StdFileTypes.JAVA, VirtualFileFilter.ALL, new HasPolygeneImportPackageCondition(), - new FacetDetector<PsiFile, PolygeneFacetConfiguration>( "PolygeneFacetDetector" ) - { - @Override - public PolygeneFacetConfiguration detectFacet( PsiFile source, - Collection<PolygeneFacetConfiguration> existingConfigurations ) - { - if( !existingConfigurations.isEmpty() ) - { - return existingConfigurations.iterator().next(); - } - - return createDefaultConfiguration(); - } - } - ); - } - - private static class HasPolygeneImportPackageCondition - implements Condition<PsiFile> - { - public final boolean value( PsiFile psiFile ) - { - final boolean[] hasPolygeneImportPackage = new boolean[]{ false }; - - psiFile.accept( new JavaElementVisitor() - { - @Override - public final void visitImportStatement( PsiImportStatement statement ) - { - String packageName = statement.getQualifiedName(); - if( packageName != null && packageName.startsWith( "org.apache.polygene" ) ) - { - hasPolygeneImportPackage[ 0 ] = true; - } - } - - @Override - public void visitReferenceExpression( PsiReferenceExpression expression ) - { - // Ignore - } - } ); - return hasPolygeneImportPackage[ 0 ]; - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/ui/PolygeneFacetEditorTab.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/ui/PolygeneFacetEditorTab.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/ui/PolygeneFacetEditorTab.java deleted file mode 100644 index dc4b121..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/facet/ui/PolygeneFacetEditorTab.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.facet.ui; - -import com.intellij.facet.ui.FacetEditorContext; -import com.intellij.facet.ui.FacetEditorTab; -import com.intellij.openapi.options.ConfigurationException; -import org.jetbrains.annotations.Nls; - -import javax.swing.*; - -/** - * @author [email protected] - * @since 0.1 - */ -public final class PolygeneFacetEditorTab extends FacetEditorTab -{ - private final FacetEditorContext editorContext; - - public PolygeneFacetEditorTab( FacetEditorContext aContext ) - { - editorContext = aContext; - } - - @Nls - public final String getDisplayName() - { - return "Polygene"; - } - - public JComponent createComponent() - { - return new JPanel(); - } - - public final boolean isModified() - { - return false; - } - - public final void apply() - throws ConfigurationException - { - // From UI to configuration - } - - public final void reset() - { - // From Configuration to UI - } - - public final void disposeUIResources() - { - // Do nothing for now - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/inspections/AbstractFix.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/inspections/AbstractFix.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/inspections/AbstractFix.java deleted file mode 100644 index 1369766..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/inspections/AbstractFix.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.inspections; - -import com.intellij.codeInspection.LocalQuickFix; -import org.jetbrains.annotations.NotNull; - -import static org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle.message; - -/** - * @author [email protected] - * @since 0.1 - */ -public abstract class AbstractFix - implements LocalQuickFix -{ - private String fixName; - - protected AbstractFix( @NotNull String name ) - { - fixName = name; - } - - @NotNull - public final String getName() - { - return fixName; - } - - @NotNull - public final String getFamilyName() - { - return message( "polygene.quick.fixes.family.name" ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/inspections/AbstractInspection.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/inspections/AbstractInspection.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/inspections/AbstractInspection.java deleted file mode 100644 index a6d0a38..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/inspections/AbstractInspection.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.inspections; - -import com.intellij.codeHighlighting.HighlightDisplayLevel; -import com.intellij.codeInspection.BaseJavaLocalInspectionTool; -import org.jetbrains.annotations.Nls; -import org.jetbrains.annotations.NotNull; -import org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle; - -import static com.intellij.codeHighlighting.HighlightDisplayLevel.ERROR; - -/** - * @author [email protected] - * @since 0.1 - */ -public abstract class AbstractInspection extends BaseJavaLocalInspectionTool -{ - private static final String POLYGENE_IDEA_INSPECTIONS_NAME = "polygene.inspections.name"; - - @Nls @NotNull public String getGroupDisplayName() - { - return PolygeneResourceBundle.message( POLYGENE_IDEA_INSPECTIONS_NAME ); - } - - @NotNull - protected abstract String resourceBundlePrefixId(); - - @Nls @NotNull - public final String getDisplayName() - { - return PolygeneResourceBundle.message( resourceBundlePrefixId() + ".name.display" ); - } - - @NotNull @Override - public HighlightDisplayLevel getDefaultLevel() - { - return ERROR; - } - - @Override - public boolean isEnabledByDefault() - { - return true; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/intentions/AbstractIntention.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/intentions/AbstractIntention.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/intentions/AbstractIntention.java deleted file mode 100644 index d50693f..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/intentions/AbstractIntention.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.intentions; - -import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction; -import com.intellij.openapi.editor.CaretModel; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.ReadonlyStatusHandler; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import static org.apache.polygene.ide.plugin.idea.common.resource.PolygeneResourceBundle.message; - -/** - * This class is based from {@code com.siyeh.ipp.base.Intention} - * - * @author [email protected] - */ -public abstract class AbstractIntention extends PsiElementBaseIntentionAction -{ - protected abstract boolean isIntentionValidFor( PsiElement element ); - - protected abstract String resourceBundlePrefixId(); - - /** - * Implement this method to process intention. - * - * @param project The project in which the availability is checked. - * @param editor The editor in which the intention will be invoked. - * @param element The element under caret. - */ - protected abstract void processIntention( @NotNull Project project, - @NotNull Editor editor, - @NotNull PsiElement element ); - - public void invoke( @NotNull Project project, Editor editor, PsiFile file ) - throws IncorrectOperationException - { - if( isFileReadOnly( project, file ) ) - { - return; - } - - final PsiElement element = findMatchingElement( file, editor ); - if( element == null ) - { - return; - } - - processIntention( project, editor, element ); - } - - protected static boolean isFileReadOnly( @NotNull Project project, @NotNull PsiFile file ) - { - VirtualFile virtualFile = file.getVirtualFile(); - ReadonlyStatusHandler readonlyStatusHandler = ReadonlyStatusHandler.getInstance( project ); - ReadonlyStatusHandler.OperationStatus operationStatus = - readonlyStatusHandler.ensureFilesWritable( virtualFile ); - return operationStatus.hasReadonlyFiles(); - } - - @Nullable - private PsiElement findMatchingElement( @NotNull PsiFile file, @NotNull Editor editor ) - { - CaretModel caretModel = editor.getCaretModel(); - int position = caretModel.getOffset(); - PsiElement element = file.findElementAt( position ); - return findMatchingElement( element ); - } - - @Nullable - private PsiElement findMatchingElement( @Nullable PsiElement element ) - { - while( element != null ) - { - if( isIntentionValidFor( element ) ) - { - return element; - } - else - { - element = element.getParent(); - if( element instanceof PsiFile ) - { - break; - } - } - } - - return null; - } - - @Override - public boolean isAvailable( @NotNull Project project, Editor editor, @Nullable PsiElement element ) - { - return isIntentionValidFor( element ); - } - - @NotNull - public final String getFamilyName() - { - return message( resourceBundlePrefixId() + ".family.name" ); - } - - @NotNull - @Override - public final String getText() - { - return message( resourceBundlePrefixId() + ".name" ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/e0e1d7d4/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/psi/PsiAnnotationUtil.java ---------------------------------------------------------------------- diff --git a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/psi/PsiAnnotationUtil.java b/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/psi/PsiAnnotationUtil.java deleted file mode 100644 index 4840a04..0000000 --- a/tools/qidea/src/main/java/org/apache/zest/ide/plugin/idea/common/psi/PsiAnnotationUtil.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ - -package org.apache.polygene.ide.plugin.idea.common.psi; - -import com.intellij.psi.*; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.LinkedList; -import java.util.List; - -import static java.util.Collections.emptyList; - -/** - * @author [email protected] - * @since 0.1 - */ -public class PsiAnnotationUtil -{ - @NotNull - public static List<PsiAnnotationMemberValue> getAnnotationDefaultParameterValue( @Nullable PsiAnnotation annotation ) - { - if( annotation == null ) - { - return emptyList(); - } - - List<PsiAnnotationMemberValue> defaultParameterValues = new LinkedList<PsiAnnotationMemberValue>(); - - PsiAnnotationParameterList list = annotation.getParameterList(); - PsiNameValuePair[] attributes = list.getAttributes(); - for( PsiNameValuePair valuePair : attributes ) - { - String parameterName = valuePair.getName(); - if( parameterName == null || PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME.equals( parameterName ) ) - { - PsiAnnotationMemberValue value = valuePair.getValue(); - if( value == null ) - { - continue; - } - - if( value instanceof PsiArrayInitializerMemberValue ) - { - // If It's an array - PsiArrayInitializerMemberValue valueWrapper = (PsiArrayInitializerMemberValue) value; - PsiAnnotationMemberValue[] values = valueWrapper.getInitializers(); - for( PsiAnnotationMemberValue psiAnnotationMemberValue : values ) - { - if( psiAnnotationMemberValue != null ) - { - defaultParameterValues.add( psiAnnotationMemberValue ); - } - } - } - else - { - // If there's only one value - defaultParameterValues.add( value ); - } - - break; - } - } - - return defaultParameterValues; - } - - @Nullable - public static PsiJavaCodeReferenceElement getClassReference( @NotNull PsiAnnotationMemberValue value ) - { - if( value instanceof PsiClassObjectAccessExpression ) - { - PsiClassObjectAccessExpression objectAccessExpression = (PsiClassObjectAccessExpression) value; - PsiTypeElement typeElement = objectAccessExpression.getOperand(); - return typeElement.getInnermostComponentReferenceElement(); - } - - return null; - } -}
