2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.psi
.impl
;
18 import com
.intellij
.lang
.*;
19 import com
.intellij
.lexer
.Lexer
;
20 import com
.intellij
.openapi
.diagnostic
.Logger
;
21 import com
.intellij
.openapi
.project
.Project
;
22 import com
.intellij
.pom
.java
.LanguageLevel
;
23 import com
.intellij
.psi
.*;
24 import com
.intellij
.psi
.codeStyle
.CodeStyleManager
;
25 import com
.intellij
.psi
.codeStyle
.CodeStyleSettingsManager
;
26 import com
.intellij
.psi
.codeStyle
.JavaCodeStyleManager
;
27 import com
.intellij
.psi
.impl
.light
.*;
28 import com
.intellij
.psi
.impl
.source
.*;
29 import com
.intellij
.psi
.impl
.source
.codeStyle
.CodeEditUtil
;
30 import com
.intellij
.psi
.impl
.source
.tree
.*;
31 import com
.intellij
.psi
.javadoc
.PsiDocTag
;
32 import com
.intellij
.psi
.search
.GlobalSearchScope
;
33 import com
.intellij
.psi
.tree
.IElementType
;
34 import com
.intellij
.psi
.util
.PsiUtil
;
35 import com
.intellij
.util
.IncorrectOperationException
;
36 import com
.intellij
.util
.containers
.HashMap
;
37 import org
.jetbrains
.annotations
.NonNls
;
38 import org
.jetbrains
.annotations
.NotNull
;
39 import org
.jetbrains
.annotations
.Nullable
;
43 public class PsiElementFactoryImpl
extends PsiJavaParserFacadeImpl
implements PsiElementFactory
{
44 private static final Logger LOG
= Logger
.getInstance("#com.intellij.psi.impl.PsiElementFactoryImpl");
46 private PsiClass ARRAY_CLASS
;
47 private PsiClass ARRAY_CLASS15
;
53 private static void initPrimitiveTypes() {
54 ourPrimitiveTypesMap
.put(PsiType
.BYTE
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.BYTE
);
55 ourPrimitiveTypesMap
.put(PsiType
.CHAR
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.CHAR
);
56 ourPrimitiveTypesMap
.put(PsiType
.DOUBLE
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.DOUBLE
);
57 ourPrimitiveTypesMap
.put(PsiType
.FLOAT
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.FLOAT
);
58 ourPrimitiveTypesMap
.put(PsiType
.INT
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.INT
);
59 ourPrimitiveTypesMap
.put(PsiType
.LONG
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.LONG
);
60 ourPrimitiveTypesMap
.put(PsiType
.SHORT
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.SHORT
);
61 ourPrimitiveTypesMap
.put(PsiType
.BOOLEAN
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.BOOLEAN
);
62 ourPrimitiveTypesMap
.put(PsiType
.VOID
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.VOID
);
63 ourPrimitiveTypesMap
.put(PsiType
.NULL
.getCanonicalText(), (PsiPrimitiveType
)PsiType
.NULL
);
66 public PsiElementFactoryImpl(PsiManagerEx manager
) {
70 public PsiJavaFile
getDummyJavaFile() {
71 if (myDummyJavaFile
== null) {
72 myDummyJavaFile
= createDummyJavaFile("");
75 return myDummyJavaFile
;
79 public PsiClass
getArrayClass(@NotNull LanguageLevel languageLevel
) {
81 if (languageLevel
.compareTo(LanguageLevel
.JDK_1_5
) < 0) {
82 if (ARRAY_CLASS
== null) {
83 ARRAY_CLASS
= createClassFromText("public class __Array__{\n public final int length; \n public Object clone(){}\n}", null).getInnerClasses()[0];
88 if (ARRAY_CLASS15
== null) {
89 ARRAY_CLASS15
= createClassFromText("public class __Array__<T>{\n public final int length; \n public T[] clone(){}\n}", null).getInnerClasses()[0];
94 catch (IncorrectOperationException e
) {
101 public PsiClassType
getArrayClassType(@NotNull PsiType componentType
, @NotNull final LanguageLevel languageLevel
) {
102 PsiClass arrayClass
= getArrayClass(languageLevel
);
103 PsiSubstitutor substitutor
= PsiSubstitutor
.EMPTY
;
104 PsiTypeParameter
[] typeParameters
= arrayClass
.getTypeParameters();
105 if (typeParameters
.length
== 1) {
106 substitutor
= substitutor
.put(typeParameters
[0], componentType
);
109 return createType(arrayClass
, substitutor
);
113 public PsiClassType
createType(@NotNull PsiClass resolve
, @NotNull PsiSubstitutor substitutor
) {
114 return new PsiImmediateClassType(resolve
, substitutor
);
118 public PsiClassType
createType(@NotNull PsiClass resolve
, @NotNull PsiSubstitutor substitutor
, @NotNull LanguageLevel languageLevel
) {
119 return new PsiImmediateClassType(resolve
, substitutor
, languageLevel
);
123 public PsiClassType
createType(@NotNull PsiClass resolve
,
124 @NotNull PsiSubstitutor substitutor
,
125 @NotNull LanguageLevel languageLevel
,
126 @NotNull PsiAnnotation
[] annotations
) {
127 return new PsiImmediateClassType(resolve
, substitutor
, languageLevel
, annotations
);
131 public PsiClass
createClass(@NotNull String name
) throws IncorrectOperationException
{
132 PsiUtil
.checkIsIdentifier(myManager
, name
);
133 @NonNls String text
= "public class " + name
+ "{ }";
134 PsiJavaFile aFile
= createDummyJavaFile(text
);
135 PsiClass
[] classes
= aFile
.getClasses();
136 if (classes
.length
!= 1) {
137 throw new IncorrectOperationException();
143 public PsiClass
createInterface(@NotNull String name
) throws IncorrectOperationException
{
144 PsiUtil
.checkIsIdentifier(myManager
, name
);
145 @NonNls String text
= "public interface " + name
+ "{ }";
146 PsiJavaFile aFile
= createDummyJavaFile(text
);
147 PsiClass
[] classes
= aFile
.getClasses();
148 if (classes
.length
!= 1) {
149 throw new IncorrectOperationException();
154 public PsiClass
createEnum(@NotNull final String name
) throws IncorrectOperationException
{
155 PsiUtil
.checkIsIdentifier(myManager
, name
);
156 @NonNls String text
= "public enum " + name
+ "{ }";
157 PsiJavaFile aFile
= createDummyJavaFile(text
);
158 PsiClass
[] classes
= aFile
.getClasses();
159 if (classes
.length
!= 1) {
160 throw new IncorrectOperationException();
166 public PsiTypeElement
createTypeElement(@NotNull PsiType psiType
) {
167 final LightTypeElement element
= new LightTypeElement(myManager
, psiType
);
168 CodeEditUtil
.setNodeGenerated(element
.getNode(), true);
173 public PsiJavaCodeReferenceElement
createReferenceElementByType(@NotNull PsiClassType type
) {
174 if (type
instanceof PsiClassReferenceType
) {
175 return ((PsiClassReferenceType
)type
).getReference();
178 final PsiClassType
.ClassResolveResult resolveResult
= type
.resolveGenerics();
179 return new LightClassReference(myManager
, type
.getPresentableText(), resolveResult
.getElement(), resolveResult
.getSubstitutor());
183 public PsiField
createField(@NotNull String name
, @NotNull PsiType type
) throws IncorrectOperationException
{
184 PsiUtil
.checkIsIdentifier(myManager
, name
);
185 if (PsiType
.NULL
.equals(type
)) {
186 throw new IncorrectOperationException("Cannot create field with type \"<null_type>\".");
188 TreeElement typeCopy
= ChangeUtil
.copyToElement(createTypeElement(type
));
189 typeCopy
.acceptTree(new GeneratedMarkerVisitor());
190 @NonNls String text
= "class _Dummy_ {private int " + name
+ ";}";
191 PsiJavaFile aFile
= createDummyJavaFile(text
);
192 PsiClass aClass
= aFile
.getClasses()[0];
193 PsiField field
= aClass
.getFields()[0];
194 SourceTreeToPsiMap
.psiElementToTree(field
).replaceChild(SourceTreeToPsiMap
.psiElementToTree(field
.getTypeElement()), typeCopy
);
195 ChangeUtil
.decodeInformation((TreeElement
)SourceTreeToPsiMap
.psiElementToTree(field
));
196 return (PsiField
)CodeStyleManager
.getInstance(myManager
.getProject()).reformat(field
);
200 public PsiMethod
createMethod(@NotNull String name
, PsiType returnType
) throws IncorrectOperationException
{
201 PsiUtil
.checkIsIdentifier(myManager
, name
);
202 if (PsiType
.NULL
.equals(returnType
)) {
203 throw new IncorrectOperationException("Cannot create field with type \"<null_type>\".");
205 @NonNls String text
= "class _Dummy_ {\n public " + returnType
.getCanonicalText() + " " + name
+ "(){}\n}";
206 PsiJavaFile aFile
= createDummyJavaFile(text
);
207 PsiClass aClass
= aFile
.getClasses()[0];
208 PsiMethod method
= aClass
.getMethods()[0];
209 JavaCodeStyleManager
.getInstance(myManager
.getProject()).shortenClassReferences(method
);
210 return (PsiMethod
)CodeStyleManager
.getInstance(myManager
.getProject()).reformat(method
);
214 public PsiMethod
createConstructor() {
216 @NonNls String text
= "class _Dummy_ {\n public _Dummy_(){}\n}";
217 PsiJavaFile aFile
= createDummyJavaFile(text
);
218 PsiClass aClass
= aFile
.getClasses()[0];
219 PsiMethod method
= aClass
.getMethods()[0];
220 return (PsiMethod
)CodeStyleManager
.getInstance(myManager
.getProject()).reformat(method
);
222 catch (IncorrectOperationException e
) {
223 LOG
.assertTrue(false);
229 public PsiClassInitializer
createClassInitializer() throws IncorrectOperationException
{
230 @NonNls String text
= "class _Dummy_ { {} }";
231 final PsiJavaFile aFile
= createDummyJavaFile(text
);
232 final PsiClass aClass
= aFile
.getClasses()[0];
233 final PsiClassInitializer psiClassInitializer
= aClass
.getInitializers()[0];
234 return (PsiClassInitializer
)CodeStyleManager
.getInstance(myManager
.getProject()).reformat(psiClassInitializer
);
238 public PsiParameter
createParameter(@NotNull String name
, @NotNull PsiType type
) throws IncorrectOperationException
{
239 PsiUtil
.checkIsIdentifier(myManager
, name
);
240 if (PsiType
.NULL
.equals(type
)) {
241 throw new IncorrectOperationException("Cannot create field with type \"<null_type>\".");
243 final FileElement treeHolder
= DummyHolderFactory
.createHolder(myManager
, null).getTreeElement();
244 final CompositeElement treeElement
=
245 getJavaParsingContext(treeHolder
).getDeclarationParsing().parseParameterText(type
.getCanonicalText() + " " + name
);
246 treeHolder
.rawAddChildren(treeElement
);
248 CodeStyleManager codeStyleManager
= CodeStyleManager
.getInstance(myManager
.getProject());
249 PsiParameter parameter
= (PsiParameter
)SourceTreeToPsiMap
.treeElementToPsi(treeElement
);
250 PsiUtil
.setModifierProperty(parameter
, PsiModifier
.FINAL
, CodeStyleSettingsManager
.getSettings(myManager
.getProject()).GENERATE_FINAL_PARAMETERS
);
251 treeElement
.acceptTree(new GeneratedMarkerVisitor());
252 JavaCodeStyleManager
.getInstance(myManager
.getProject()).shortenClassReferences(parameter
);
253 return (PsiParameter
)codeStyleManager
.reformat(parameter
);
257 public PsiCodeBlock
createCodeBlock() {
259 PsiCodeBlock block
= createCodeBlockFromText("{}", null);
260 return (PsiCodeBlock
)CodeStyleManager
.getInstance(myManager
.getProject()).reformat(block
);
262 catch (IncorrectOperationException e
) {
269 public PsiClassType
createType(@NotNull PsiClass aClass
) {
270 return new PsiImmediateClassType(aClass
, aClass
instanceof PsiTypeParameter ? PsiSubstitutor
.EMPTY
: createRawSubstitutor(aClass
));
274 public PsiClassType
createType(@NotNull PsiJavaCodeReferenceElement classReference
) {
275 return new PsiClassReferenceType(classReference
, null);
278 private static class TypeDetacher
extends PsiTypeVisitor
<PsiType
> {
279 public static final TypeDetacher INSTANCE
= new TypeDetacher();
281 public PsiType
visitType(PsiType type
) {
285 public PsiType
visitWildcardType(PsiWildcardType wildcardType
) {
286 final PsiType bound
= wildcardType
.getBound();
291 return PsiWildcardType
.changeBound(wildcardType
, bound
.accept(this));
295 public PsiType
visitArrayType(PsiArrayType arrayType
) {
296 final PsiType componentType
= arrayType
.getComponentType();
297 final PsiType detachedComponentType
= componentType
.accept(this);
298 if (detachedComponentType
== componentType
) return arrayType
; // optimization
299 return detachedComponentType
.createArrayType();
302 public PsiType
visitClassType(PsiClassType classType
) {
303 final PsiClassType
.ClassResolveResult resolveResult
= classType
.resolveGenerics();
304 final PsiClass aClass
= resolveResult
.getElement();
305 if (aClass
== null) return classType
;
306 final HashMap
<PsiTypeParameter
, PsiType
> map
= new HashMap
<PsiTypeParameter
, PsiType
>();
307 for (PsiTypeParameter parameter
: PsiUtil
.typeParametersIterable(aClass
)) {
308 PsiType type
= resolveResult
.getSubstitutor().substitute(parameter
);
310 type
= type
.accept(this);
312 map
.put(parameter
, type
);
314 return new PsiImmediateClassType(aClass
, PsiSubstitutorImpl
.createSubstitutor(map
));
320 public PsiType
detachType(@NotNull PsiType type
) {
321 return type
.accept(TypeDetacher
.INSTANCE
);
325 public PsiSubstitutor
createRawSubstitutor(@NotNull PsiTypeParameterListOwner owner
) {
326 Map
<PsiTypeParameter
, PsiType
> substMap
= null;
327 for (PsiTypeParameter parameter
: PsiUtil
.typeParametersIterable(owner
)) {
328 if (substMap
== null) substMap
= new HashMap
<PsiTypeParameter
, PsiType
>();
329 substMap
.put(parameter
, null);
331 return PsiSubstitutorImpl
.createSubstitutor(substMap
);
334 public PsiSubstitutor
createRawSubstitutor(@NotNull PsiSubstitutor baseSubstitutor
, @NotNull PsiTypeParameter
[] typeParameters
) {
335 Map
<PsiTypeParameter
, PsiType
> substMap
= null;
336 for (PsiTypeParameter parameter
: typeParameters
) {
337 if (substMap
== null) substMap
= new HashMap
<PsiTypeParameter
, PsiType
>();
338 substMap
.put(parameter
, null);
340 return baseSubstitutor
.putAll(PsiSubstitutorImpl
.createSubstitutor(substMap
));
344 public PsiElement
createDummyHolder(@NotNull String text
, @NotNull IElementType type
, @Nullable PsiElement context
) {
345 final DummyHolder result
= DummyHolderFactory
.createHolder(myManager
, context
);
346 final FileElement holder
= result
.getTreeElement();
347 final Language language
= type
.getLanguage();
348 final ParserDefinition parserDefinition
= LanguageParserDefinitions
.INSTANCE
.forLanguage(language
);
349 if (parserDefinition
== null) {
350 throw new AssertionError("No parser definition for language " + language
);
352 final Project project
= myManager
.getProject();
353 final Lexer lexer
= parserDefinition
.createLexer(project
);
354 final PsiBuilder builder
= PsiBuilderFactory
.getInstance().createBuilder(project
, holder
, lexer
, language
, text
);
355 final ASTNode node
= parserDefinition
.createParser(project
).parse(type
, builder
);
356 holder
.rawAddChildren((TreeElement
)node
);
357 return node
.getPsi();
361 public PsiSubstitutor
createSubstitutor(@NotNull Map
<PsiTypeParameter
, PsiType
> map
) {
362 return PsiSubstitutorImpl
.createSubstitutor(map
);
366 public PsiPrimitiveType
createPrimitiveType(@NotNull String text
) {
367 return getPrimitiveType(text
);
370 public static PsiPrimitiveType
getPrimitiveType(final String text
) {
371 return ourPrimitiveTypesMap
.get(text
);
375 public PsiClassType
createTypeByFQClassName(@NotNull String qName
) {
376 return createTypeByFQClassName(qName
, GlobalSearchScope
.allScope(myManager
.getProject()));
380 public PsiClassType
createTypeByFQClassName(@NotNull String qName
, @NotNull GlobalSearchScope resolveScope
) {
381 return new PsiClassReferenceType(createReferenceElementByFQClassName(qName
, resolveScope
), null);
385 public PsiJavaCodeReferenceElement
createClassReferenceElement(@NotNull PsiClass aClass
) {
387 if (aClass
instanceof PsiAnonymousClass
) {
388 text
= ((PsiAnonymousClass
)aClass
).getBaseClassType().getPresentableText();
391 text
= aClass
.getName();
393 return new LightClassReference(myManager
, text
, aClass
);
397 public PsiJavaCodeReferenceElement
createReferenceElementByFQClassName(@NotNull String qName
, @NotNull GlobalSearchScope resolveScope
) {
398 String shortName
= PsiNameHelper
.getShortClassName(qName
);
399 return new LightClassReference(myManager
, shortName
, qName
, resolveScope
);
403 public PsiJavaCodeReferenceElement
createFQClassNameReferenceElement(@NotNull String qName
, @NotNull GlobalSearchScope resolveScope
) {
404 return new LightClassReference(myManager
, qName
, qName
, resolveScope
);
408 public PsiJavaCodeReferenceElement
createPackageReferenceElement(@NotNull PsiPackage aPackage
)
409 throws IncorrectOperationException
{
410 if (aPackage
.getQualifiedName().length() == 0) {
411 throw new IncorrectOperationException("Cannot create reference to default package.");
413 return new LightPackageReference(myManager
, aPackage
);
417 public PsiPackageStatement
createPackageStatement(@NotNull String name
) throws IncorrectOperationException
{
418 final PsiJavaFile javaFile
= (PsiJavaFile
)PsiFileFactory
.getInstance(myManager
.getProject()).createFileFromText("dummy.java", "package " + name
+ ";");
419 final PsiPackageStatement stmt
= javaFile
.getPackageStatement();
420 if (stmt
== null) throw new IncorrectOperationException("Incorrect package name: " + name
);
425 public PsiJavaCodeReferenceCodeFragment
createReferenceCodeFragment(@NotNull String text
,
428 boolean isClassesAccepted
) {
429 final PsiJavaCodeReferenceCodeFragmentImpl result
=
430 new PsiJavaCodeReferenceCodeFragmentImpl(myManager
.getProject(), isPhysical
, "fragment.java", text
, isClassesAccepted
);
431 result
.setContext(context
);
436 public PsiImportStaticStatement
createImportStaticStatement(@NotNull PsiClass aClass
, @NotNull String memberName
) throws IncorrectOperationException
{
437 if (aClass
instanceof PsiAnonymousClass
) {
438 throw new IncorrectOperationException("Cannot create import statement for anonymous class.");
440 else if (aClass
.getParent() instanceof PsiDeclarationStatement
) {
441 throw new IncorrectOperationException("Cannot create import statement for local class.");
443 @NonNls String text
= "import static " + aClass
.getQualifiedName() + "." + memberName
+ ";";
444 PsiJavaFile aFile
= createDummyJavaFile(text
);
445 PsiImportStaticStatement statement
= aFile
.getImportList().getImportStaticStatements()[0];
446 return (PsiImportStaticStatement
)CodeStyleManager
.getInstance(myManager
.getProject()).reformat(statement
);
450 public PsiParameterList
createParameterList(@NotNull String
[] names
, @NotNull PsiType
[] types
) throws IncorrectOperationException
{
451 @NonNls String text
= "void method(";
453 for (int i
= 0; i
< names
.length
; i
++) {
454 final String name
= names
[i
];
455 PsiType type
= types
[i
];
456 text
+= sep
+ type
.getCanonicalText() + " " + name
;
460 PsiMethod method
= createMethodFromText(text
, null);
461 return method
.getParameterList();
465 public PsiReferenceList
createReferenceList(@NotNull PsiJavaCodeReferenceElement
[] references
) throws IncorrectOperationException
{
466 @NonNls String text
= "void method() ";
467 if (references
.length
> 0) text
+= "throws ";
469 for (final PsiJavaCodeReferenceElement reference
: references
) {
470 text
+= sep
+ reference
.getCanonicalText();
474 PsiMethod method
= createMethodFromText(text
, null);
475 return method
.getThrowsList();
479 public PsiJavaCodeReferenceElement
createPackageReferenceElement(@NotNull String packageName
)
480 throws IncorrectOperationException
{
481 if (packageName
.length() == 0) {
482 throw new IncorrectOperationException("Cannot create reference to default package.");
484 return new LightPackageReference(myManager
, packageName
);
488 public PsiReferenceExpression
createReferenceExpression(@NotNull PsiClass aClass
) throws IncorrectOperationException
{
490 if (aClass
instanceof PsiAnonymousClass
) {
491 text
= ((PsiAnonymousClass
)aClass
).getBaseClassType().getPresentableText();
494 text
= aClass
.getName();
496 return new LightClassReferenceExpression(myManager
, text
, aClass
);
500 public PsiReferenceExpression
createReferenceExpression(@NotNull PsiPackage aPackage
) throws IncorrectOperationException
{
501 if (aPackage
.getQualifiedName().length() == 0) {
502 throw new IncorrectOperationException("Cannot create reference to default package.");
504 return new LightPackageReferenceExpression(myManager
, aPackage
);
508 public PsiIdentifier
createIdentifier(@NotNull String text
) throws IncorrectOperationException
{
509 PsiUtil
.checkIsIdentifier(myManager
, text
);
510 return new LightIdentifier(myManager
, text
);
514 public PsiKeyword
createKeyword(@NotNull String text
) throws IncorrectOperationException
{
515 if (!JavaPsiFacade
.getInstance(myManager
.getProject()).getNameHelper().isKeyword(text
)) {
516 throw new IncorrectOperationException("\"" + text
+ "\" is not a keyword.");
518 return new LightKeyword(myManager
, text
);
522 public PsiImportStatement
createImportStatement(@NotNull PsiClass aClass
) throws IncorrectOperationException
{
523 if (aClass
instanceof PsiAnonymousClass
) {
524 throw new IncorrectOperationException("Cannot create import statement for anonymous class.");
526 else if (aClass
.getParent() instanceof PsiDeclarationStatement
) {
527 throw new IncorrectOperationException("Cannot create import statement for local class.");
529 @NonNls String text
= "import " + aClass
.getQualifiedName() + ";";
530 PsiJavaFile aFile
= createDummyJavaFile(text
);
531 PsiImportStatement statement
= aFile
.getImportList().getImportStatements()[0];
532 return (PsiImportStatement
)CodeStyleManager
.getInstance(myManager
.getProject()).reformat(statement
);
536 public PsiImportStatement
createImportStatementOnDemand(@NotNull String packageName
) throws IncorrectOperationException
{
537 if (packageName
.length() == 0) {
538 throw new IncorrectOperationException("Cannot create import statement for default package.");
540 if (!JavaPsiFacade
.getInstance(myManager
.getProject()).getNameHelper().isQualifiedName(packageName
)) {
541 throw new IncorrectOperationException("Incorrect package name: \"" + packageName
+ "\".");
544 @NonNls String text
= "import " + packageName
+ ".*;";
545 PsiJavaFile aFile
= createDummyJavaFile(text
);
546 PsiImportStatement statement
= aFile
.getImportList().getImportStatements()[0];
547 return (PsiImportStatement
)CodeStyleManager
.getInstance(myManager
.getProject()).reformat(statement
);
551 public PsiDeclarationStatement
createVariableDeclarationStatement(@NotNull String name
, @NotNull PsiType type
, PsiExpression initializer
)
552 throws IncorrectOperationException
{
553 if (!JavaPsiFacade
.getInstance(myManager
.getProject()).getNameHelper().isIdentifier(name
)) {
554 throw new IncorrectOperationException("\"" + name
+ "\" is not an identifier.");
556 if (PsiType
.NULL
.equals(type
)) {
557 throw new IncorrectOperationException("Cannot create field with type \"<null_type>\".");
559 @NonNls StringBuilder buffer
= new StringBuilder();
562 if (initializer
!= null) {
566 PsiDeclarationStatement statement
= (PsiDeclarationStatement
)createStatementFromText(buffer
.toString(), null);
567 PsiVariable variable
= (PsiVariable
)statement
.getDeclaredElements()[0];
568 variable
.getTypeElement().replace(createTypeElement(type
));
569 PsiUtil
.setModifierProperty(variable
, PsiModifier
.FINAL
, CodeStyleSettingsManager
.getSettings(myManager
.getProject()).GENERATE_FINAL_LOCALS
);
570 if (initializer
!= null) {
571 variable
.getInitializer().replace(initializer
);
573 markGenerated(statement
);
579 public PsiDocTag
createParamTag(@NotNull String parameterName
, @NonNls String description
) throws IncorrectOperationException
{
580 @NonNls StringBuilder buffer
= new StringBuilder();
581 buffer
.append(" * @param ");
582 buffer
.append(parameterName
);
584 final String
[] strings
= description
.split("\\n");
585 for (int i
= 0; i
< strings
.length
; i
++) {
586 String string
= strings
[i
];
587 if (i
> 0) buffer
.append("\n * ");
588 buffer
.append(string
);
590 return createDocTagFromText(buffer
.toString(), null);
594 public PsiExpressionCodeFragment
createExpressionCodeFragment(@NotNull String text
,
596 final PsiType expectedType
,
597 boolean isPhysical
) {
598 final PsiExpressionCodeFragmentImpl result
= new PsiExpressionCodeFragmentImpl(
599 myManager
.getProject(), isPhysical
, "fragment.java", text
, expectedType
);
600 result
.setContext(context
);
605 public JavaCodeFragment
createCodeBlockCodeFragment(@NotNull String text
, PsiElement context
, boolean isPhysical
) {
606 final PsiCodeFragmentImpl result
= new PsiCodeFragmentImpl(myManager
.getProject(), JavaElementType
.STATEMENTS
,
610 result
.setContext(context
);
615 public PsiTypeCodeFragment
createTypeCodeFragment(@NotNull String text
, PsiElement context
, boolean isPhysical
) {
617 return createTypeCodeFragment(text
, context
, false, isPhysical
, false);
622 public PsiTypeCodeFragment
createTypeCodeFragment(@NotNull String text
,
625 boolean isPhysical
) {
626 return createTypeCodeFragment(text
, context
, true, isPhysical
, false);
630 public PsiTypeCodeFragment
createTypeCodeFragment(@NotNull String text
,
634 boolean allowEllipsis
) {
635 final PsiTypeCodeFragmentImpl result
= new PsiTypeCodeFragmentImpl(myManager
.getProject(),
640 result
.setContext(context
);
642 result
.putUserData(PsiUtil
.VALID_VOID_TYPE_IN_CODE_FRAGMENT
, Boolean
.TRUE
);
649 public PsiAnnotation
createAnnotationFromText(@NotNull final String annotationText
, final PsiElement context
) throws IncorrectOperationException
{
650 final PsiAnnotation psiAnnotation
= super.createAnnotationFromText(annotationText
, context
);
651 markGenerated(psiAnnotation
);
652 return psiAnnotation
;
656 public PsiCodeBlock
createCodeBlockFromText(@NotNull final String text
, final PsiElement context
) throws IncorrectOperationException
{
657 final PsiCodeBlock psiCodeBlock
= super.createCodeBlockFromText(text
, context
);
658 markGenerated(psiCodeBlock
);
663 public PsiEnumConstant
createEnumConstantFromText(@NotNull final String text
, final PsiElement context
) throws IncorrectOperationException
{
664 final PsiEnumConstant enumConstant
= super.createEnumConstantFromText(text
, context
);
665 markGenerated(enumConstant
);
670 public PsiExpression
createExpressionFromText(@NotNull final String text
, final PsiElement context
) throws IncorrectOperationException
{
671 final PsiExpression expression
= super.createExpressionFromText(text
, context
);
672 markGenerated(expression
);
677 public PsiField
createFieldFromText(@NotNull final String text
, final PsiElement context
) throws IncorrectOperationException
{
678 final PsiField psiField
= super.createFieldFromText(text
, context
);
679 markGenerated(psiField
);
684 public PsiParameter
createParameterFromText(@NotNull final String text
, final PsiElement context
) throws IncorrectOperationException
{
685 final PsiParameter parameter
= super.createParameterFromText(text
, context
);
686 markGenerated(parameter
);
691 public PsiStatement
createStatementFromText(@NotNull final String text
, final PsiElement context
) throws IncorrectOperationException
{
692 final PsiStatement statement
= super.createStatementFromText(text
, context
);
693 markGenerated(statement
);
698 public PsiType
createTypeFromText(@NotNull final String text
, final PsiElement context
) throws IncorrectOperationException
{
699 return createTypeInner(text
, context
, true);
703 public PsiTypeParameter
createTypeParameterFromText(@NotNull final String text
, final PsiElement context
) throws
704 IncorrectOperationException
{
705 final PsiTypeParameter typeParameter
= super.createTypeParameterFromText(text
, context
);
706 markGenerated(typeParameter
);
707 return typeParameter
;
711 public PsiElement
createWhiteSpaceFromText(@NotNull @NonNls final String text
) throws IncorrectOperationException
{
712 final PsiElement whitespace
= super.createWhiteSpaceFromText(text
);
713 markGenerated(whitespace
);
718 public PsiMethod
createMethodFromText(@NotNull final String text
, final PsiElement context
, final LanguageLevel level
) throws
719 IncorrectOperationException
{
720 final PsiMethod method
= super.createMethodFromText(text
, context
, level
);
721 markGenerated(method
);
727 public PsiCatchSection
createCatchSection(@NotNull final PsiClassType exceptionType
,
728 @NotNull final String exceptionName
, final PsiElement context
) throws
729 IncorrectOperationException
{
730 final PsiCatchSection psiCatchSection
= super.createCatchSection(exceptionType
, exceptionName
, context
);
731 markGenerated(psiCatchSection
);
732 return psiCatchSection
;
735 private static void markGenerated(final PsiElement element
) {
736 ((TreeElement
)element
.getNode()).acceptTree(new GeneratedMarkerVisitor());