merge with master

This commit is contained in:
Evgeny Pasynkov
2012-06-25 12:00:18 +02:00
parent 77f8edbcf2
commit 33278f0c84
448 changed files with 9101 additions and 13350 deletions
@@ -83,10 +83,8 @@ public abstract class ValueResourcesFileParser implements IXMLBuilder {
final ResourceType resType = resTypeStr != null ? ResourceType.getEnum(resTypeStr) : null;
if (resType != null) {
if (resType == ResourceType.ATTR) {
if (!myLastNameAttr.startsWith("android:")) {
final String contextName = myContextNames.peek();
process(new ResourceEntry(resTypeStr, myLastNameAttr, contextName));
}
final String contextName = myContextNames.peek();
process(new ResourceEntry(resTypeStr, myLastNameAttr, contextName));
}
else {
process(new ResourceEntry(resTypeStr, myLastNameAttr, ""));
-3
View File
@@ -68,9 +68,6 @@
<action id="Android.EnableDdms" class="org.jetbrains.android.actions.AndroidEnableAdbServiceAction">
<add-to-group group-id="AndroidToolsGroup" anchor="last"/>
</action>
<!--<action id="GotoAndroidResourceDefinition" class="org.jetbrains.android.actions.GotoResourceAction">
<keyboard-shortcut first-keystroke="control shift alt R" keymap="$default"/>
</action>-->
<action id="RegenerateRJavaFile" class="org.jetbrains.android.actions.AndroidRegenerateRJavaFileAction">
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
<add-to-group group-id="ProjectViewPopupMenu" anchor="last"/>
@@ -54,7 +54,19 @@ public class AndroidGotoDeclarationHandler implements GotoDeclarationHandler {
return null;
}
final Pair<String, String> pair = AndroidResourceUtil.getReferredResourceField(facet, refExp);
Pair<String, String> pair = AndroidResourceUtil.getReferredResourceField(facet, refExp);
if (pair == null) {
PsiElement parent = refExp.getParent();
if (parent instanceof PsiReferenceExpression) {
pair = AndroidResourceUtil.getReferredResourceField(facet, (PsiReferenceExpression)parent);
}
if (pair == null) {
parent = parent.getParent();
if (parent instanceof PsiReferenceExpression) {
pair = AndroidResourceUtil.getReferredResourceField(facet, (PsiReferenceExpression)parent);
}
}
}
if (pair == null) {
return null;
}
@@ -177,6 +177,6 @@ public class AndroidValueResourcesIndex extends FileBasedIndexExtension<Resource
@Override
public int getVersion() {
return 2;
return 3;
}
}
@@ -75,8 +75,8 @@ public class AndroidCreateLayoutFileAction extends CreateTypedResourceFileAction
@NotNull
@Override
protected PsiElement[] create(String newName, PsiDirectory directory) throws Exception {
assert myLastRootComponentName != null;
return doCreateAndNavigate(newName, directory, myLastRootComponentName, false);
final String rootTag = myLastRootComponentName != null ? myLastRootComponentName : getDefaultRootTag();
return doCreateAndNavigate(newName, directory, rootTag, false);
}
@Override
@@ -97,18 +97,27 @@ public class CreateResourceFileAction extends CreateElementActionBase {
@NotNull String resName,
boolean chooseResName) {
final CreateResourceFileAction action = getInstance();
final MyDialog dialog =
new MyDialog(facet, action.mySubactions.values(), resType, resName, chooseResName, action, facet.getModule(), true);
dialog.show();
if (!dialog.isOK()) {
return PsiElement.EMPTY_ARRAY;
}
if (chooseResName) {
resName = dialog.getFileName();
final String subdirName;
final Module selectedModule;
if (ApplicationManager.getApplication().isUnitTestMode()) {
subdirName = resType.getName();
selectedModule = facet.getModule();
}
final String subdirName = dialog.getSubdirName();
final AndroidFacet selectedFacet = AndroidFacet.getInstance(dialog.getSelectedModule());
else {
final MyDialog dialog =
new MyDialog(facet, action.mySubactions.values(), resType, resName, chooseResName, action, facet.getModule(), true);
dialog.show();
if (!dialog.isOK()) {
return PsiElement.EMPTY_ARRAY;
}
if (chooseResName) {
resName = dialog.getFileName();
}
subdirName = dialog.getSubdirName();
selectedModule = dialog.getSelectedModule();
}
final AndroidFacet selectedFacet = AndroidFacet.getInstance(selectedModule);
LOG.assertTrue(selectedFacet != null);
final VirtualFile resourceDir = selectedFacet.getLocalResourceManager().getResourceDir();
@@ -1,39 +1,50 @@
package org.jetbrains.android.augment;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.navigation.NavigationItem;
import com.intellij.psi.*;
import com.intellij.psi.impl.ElementPresentationUtil;
import com.intellij.psi.impl.PsiClassImplUtil;
import com.intellij.psi.impl.PsiVariableEx;
import com.intellij.psi.impl.light.LightFieldBuilder;
import com.intellij.psi.impl.light.LightElement;
import com.intellij.psi.impl.light.LightModifierList;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.ui.RowIcon;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* @author Eugene.Kudelevsky
*/
class AndroidLightField extends LightFieldBuilder implements PsiVariableEx {
* @author Eugene.Kudelevsky
*/
class AndroidLightField extends LightElement implements PsiField, PsiVariableEx, NavigationItem {
private final PsiClass myContext;
private final PsiType myType;
private final Object myConstantValue;
private final boolean myFinal;
private volatile PsiExpression myInitializer;
private volatile String myName;
private volatile LightModifierList myModifierList;
public AndroidLightField(@NotNull String name,
@NotNull PsiClass context,
@NotNull PsiType type,
boolean isFinal,
@Nullable Object constantValue) {
super(name, type, context);
myContext = context;
super(context.getManager(), JavaLanguage.INSTANCE);
myName = name;
myType = type;
setNavigationElement(context);
myContext = context;
myConstantValue = constantValue;
myFinal = isFinal;
setContainingClass(context);
final List<String> modifiers = new ArrayList<String>();
modifiers.add(PsiModifier.PUBLIC);
@@ -42,7 +53,7 @@ class AndroidLightField extends LightFieldBuilder implements PsiVariableEx {
if (isFinal) {
modifiers.add(PsiModifier.FINAL);
}
setModifiers(ArrayUtil.toStringArray(modifiers));
myModifierList = new LightModifierList(getManager(), getLanguage(), ArrayUtil.toStringArray(modifiers));
}
@Override
@@ -58,9 +69,8 @@ class AndroidLightField extends LightFieldBuilder implements PsiVariableEx {
@Override
public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
final AndroidLightField field = new AndroidLightField(name, myContext, myType, myFinal, myConstantValue);
field.setInitializer(getInitializer());
return field;
myName = name;
return this;
}
@Override
@@ -72,4 +82,93 @@ class AndroidLightField extends LightFieldBuilder implements PsiVariableEx {
public Object computeConstantValue() {
return myConstantValue;
}
@Override
public void setInitializer(@Nullable PsiExpression initializer) throws IncorrectOperationException {
myInitializer = initializer;
}
@Override
public PsiExpression getInitializer() {
return myInitializer;
}
@Override
public PsiDocComment getDocComment() {
return null;
}
@Override
public boolean isDeprecated() {
return false;
}
@Override
public PsiClass getContainingClass() {
return myContext;
}
@Override
public String toString() {
return "AndroidLightField:" + getName();
}
@NotNull
@Override
public PsiType getType() {
return myType;
}
@Override
@NotNull
public PsiModifierList getModifierList() {
return myModifierList;
}
@Override
public boolean hasModifierProperty(@NonNls @NotNull String name) {
return myModifierList.hasModifierProperty(name);
}
@NotNull
@Override
public String getName() {
return myName;
}
@Override
public PsiTypeElement getTypeElement() {
return null;
}
@Override
public boolean hasInitializer() {
return false;
}
@Override
public void normalizeDeclaration() throws IncorrectOperationException {
}
@NotNull
@Override
public PsiIdentifier getNameIdentifier() {
throw new UnsupportedOperationException();
}
@Override
public PsiType getTypeNoResolve() {
return getType();
}
@Override
protected boolean isVisibilitySupported() {
return true;
}
@Override
public Icon getElementIcon(final int flags) {
final RowIcon baseIcon = ElementPresentationUtil.createLayeredIcon(PlatformIcons.FIELD_ICON, this, false);
return ElementPresentationUtil.addVisibilityIcon(this, flags, baseIcon);
}
}
@@ -71,14 +71,17 @@ class ResourceTypeClass extends AndroidLightClass {
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(facet.getModule().getProject());
final Module circularDepLibWithSamePackage = AndroidCompileUtil.findCircularDependencyOnLibraryWithSamePackage(facet);
final boolean generateNonFinalFields = facet.getConfiguration().LIBRARY_PROJECT || circularDepLibWithSamePackage != null;
int idIterator = ResourceType.getEnum(resClassName).ordinal() * 100000;
int i = 0;
for (Map.Entry<String, PsiType> entry : fieldNames.entrySet()) {
final String fieldName = AndroidResourceUtil.getFieldNameByResourceName(entry.getKey());
final PsiType type = entry.getValue();
final int id = -(idIterator++);
final AndroidLightField field =
new AndroidLightField(fieldName, context, type, !generateNonFinalFields, generateNonFinalFields ? null : 0);
field.setInitializer(factory.createExpressionFromText("0", field));
new AndroidLightField(fieldName, context, type, !generateNonFinalFields, generateNonFinalFields ? null : id);
field.setInitializer(factory.createExpressionFromText(Integer.toString(id), field));
result[i++] = field;
}
return result;
@@ -6,6 +6,7 @@ import com.intellij.codeInsight.quickfix.UnresolvedReferenceQuickFixProvider;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReferenceExpression;
import org.jetbrains.android.dom.manifest.Manifest;
@@ -44,7 +45,13 @@ public class AndroidQuickFixProvider extends UnresolvedReferenceQuickFixProvider
return;
}
final Pair<String, String> pair = AndroidResourceUtil.getReferredResourceField(facet, exp);
Pair<String, String> pair = AndroidResourceUtil.getReferredResourceField(facet, exp);
if (pair == null) {
final PsiElement parent = exp.getParent();
if (parent instanceof PsiReferenceExpression) {
pair = AndroidResourceUtil.getReferredResourceField(facet, (PsiReferenceExpression)parent);
}
}
if (pair == null) {
return;
}
@@ -5,6 +5,7 @@ import com.android.tools.lint.client.api.IssueRegistry;
import com.android.tools.lint.client.api.LintDriver;
import com.android.tools.lint.detector.api.Issue;
import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.daemon.HighlightDisplayKey;
import com.intellij.codeInsight.intention.HighPriorityAction;
import com.intellij.codeInsight.intention.IntentionAction;
@@ -278,7 +279,8 @@ public class AndroidLintExternalAnnotator extends ExternalAnnotator<State, State
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
myQuickFix.apply(myStartElement, myEndElement, AndroidQuickfixContexts.EditorContext.getInstance(editor) );
CodeInsightUtilBase.prepareFileForWrite(file);
myQuickFix.apply(myStartElement, myEndElement, AndroidQuickfixContexts.EditorContext.getInstance(editor));
}
@Override
@@ -222,9 +222,14 @@ public abstract class ResourceManager {
@NotNull
public Collection<String> getValueResourceNames(@NotNull final String resourceType) {
final Set<String> result = new HashSet<String>();
final boolean attr = ResourceType.ATTR.getName().equals(resourceType);
for (ResourceEntry entry : getValueResourceEntries(resourceType)) {
result.add(entry.getName());
final String name = entry.getName();
if (!attr || !name.startsWith("android:")) {
result.add(name);
}
}
return result;
}
@@ -0,0 +1,7 @@
package p1.p2;
public class JavaCreateResourceFromUsage {
public void f() {
int n = R.layout.un<caret>known;
}
}
@@ -0,0 +1,9 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/unknow<caret>n"
/>
</LinearLayout>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
< xmlns:android="http://schemas.android.com/apk/res/android">
</>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</LinearLayout>
@@ -0,0 +1,7 @@
package p1.p2;
public class InlineResourceField {
public void f() {
int n = R.string.my_stri<caret>ng;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
public class CreateJavaResourceFromUsage {
public void f() {
int n = R.drawable.unknown;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
public class CreateJavaResourceFromUsage {
public void f() {
int n = R.bool.unknown;
}
}
@@ -15,11 +15,18 @@ public class JavaCompletion1 {
n5 = R.styleable.MyStyleable_myAttr1;
<error>n4 = R.styleable.MyStyleable_myAttr1</error>;
n5 = R.styleable.<error>MyStyleable_text</error>;
n5 = R.styleable.MyStyleable_android_text;
switch(n1) {
case R.string.my_string:
System.out.println("abacaba");
break;
case R.string.my_string1:
System.out.println("abacaba1");
break;
case R.attr.myAttr1:
System.out.println("abacaba1");
break;
default:
break;
}
@@ -0,0 +1,3 @@
<resources>
<bool name="unknown">a</bool>
</resources>
@@ -0,0 +1,3 @@
<resources>
<drawable name="unknown">a</drawable>
</resources>
@@ -1,5 +1,6 @@
<resources>
<string name="my_string">abacaba</string>
<string name="my_string1">abacaba</string>
<style name="Theme.MyCustomStyle" parent="android:style/Theme.Dialog"></style>
<declare-styleable name="MyStyleable">
<attr name="myAttr1" format="string"/>
@@ -0,0 +1,7 @@
package p1.p2;
public final class RefR {
public void f() {
int n = R.string.str;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
public final class RefR {
public void f() {
int n = R.string.str1;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
public final class RefR {
public void f() {
int n = R.drawable.pic;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
public final class RefR {
public void f() {
int n = R.drawable.pic1;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
class Java {
public void g() {
int[] ar = R<caret>.styleable.Dec1;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
class Java {
public void g() {
int[] ar = <caret>R.styleable.Dec1;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
class Java {
public void g() {
int[] ar = R.styleable<caret>.Dec1;
}
}
@@ -0,0 +1,7 @@
package p1.p2;
class Java {
public void g() {
int[] ar = R.style<caret>able.Dec1;
}
}
@@ -18,6 +18,8 @@ package org.jetbrains.android;
import com.android.sdklib.SdkConstants;
import com.intellij.codeInsight.TargetElementUtilBase;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Editor;
@@ -28,9 +30,11 @@ import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.actions.RenameElementAction;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesProcessor;
import com.intellij.refactoring.move.moveClassesOrPackages.SingleSourceRootMoveDestination;
import com.intellij.refactoring.rename.*;
import com.intellij.testFramework.TestActionEvent;
import org.jetbrains.annotations.NonNls;
import java.io.IOException;
@@ -63,10 +67,12 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject(BASE_PATH + "pic.png", "res/drawable/pic.png");
myFixture.copyFileToProject(BASE_PATH + "styles.xml", "res/values/styles.xml");
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.copyFileToProject(BASE_PATH + "RefR2.java", "src/p1/p2/RefR2.java");
renameElementWithTextOccurences("pic1.png");
myFixture.checkResultByFile(BASE_PATH + "layout_file_after.xml");
myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true);
myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + "styles_after.xml", true);
myFixture.checkResultByFile("src/p1/p2/RefR2.java", BASE_PATH + "RefR2_after.java", true);
assertNotNull(myFixture.findFileInTempDir("res/drawable/pic1.png"));
}
@@ -77,10 +83,12 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject(BASE_PATH + "pic.png", "res/drawable/pic.9.png");
myFixture.copyFileToProject(BASE_PATH + "styles.xml", "res/values/styles.xml");
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.copyFileToProject(BASE_PATH + "RefR2.java", "src/p1/p2/RefR2.java");
renameElementWithTextOccurences("pic1.9.png");
myFixture.checkResultByFile(BASE_PATH + "layout_file_after.xml");
myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true);
myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + "styles_after.xml", true);
myFixture.checkResultByFile("src/p1/p2/RefR2.java", BASE_PATH + "RefR2_after.java", true);
assertNotNull(myFixture.findFileInTempDir("res/drawable/pic1.9.png"));
}
@@ -130,9 +138,11 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.configureFromExistingVirtualFile(file);
myFixture.copyFileToProject(BASE_PATH + "strings.xml", "res/values/strings.xml");
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.renameElementAtCaret("str1");
myFixture.copyFileToProject(BASE_PATH + "RefR1.java", "src/p1/p2/RefR1.java");
checkAndRename("str1");
myFixture.checkResultByFile(BASE_PATH + "layout_value_after.xml");
myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true);
myFixture.checkResultByFile("src/p1/p2/RefR1.java", BASE_PATH + "RefR1_after.java", true);
myFixture.checkResultByFile("res/values/strings.xml", BASE_PATH + "strings_after.xml", true);
}
@@ -190,7 +200,7 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.copyFileToProject(BASE_PATH + "layout3.xml", "res/layout/layout3.xml");
myFixture.copyFileToProject(BASE_PATH + "pic.png", "res/drawable/pic.png");
myFixture.renameElementAtCaret("pic1");
checkAndRename("pic1");
myFixture.checkResultByFile(BASE_PATH + "RefR3_after.java", true);
myFixture.checkResultByFile("res/layout/layout3.xml", BASE_PATH + "layout_file_after.xml", true);
assertNotNull(myFixture.findFileInTempDir("res/drawable/pic1.png"));
@@ -203,7 +213,7 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.copyFileToProject(BASE_PATH + "layout4.xml", "res/layout/layout4.xml");
myFixture.copyFileToProject(BASE_PATH + "strings.xml", "res/values/strings.xml");
myFixture.renameElementAtCaret("str1");
checkAndRename("str1");
myFixture.checkResultByFile(BASE_PATH + "RefR4_after.java", true);
myFixture.checkResultByFile("res/layout/layout4.xml", BASE_PATH + "layout_value_after.xml", true);
myFixture.checkResultByFile("res/values/strings.xml", BASE_PATH + "strings_after.xml", true);
@@ -214,7 +224,7 @@ public class AndroidRenameTest extends AndroidTestCase {
VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "layout5.xml", "res/layout/layout5.xml");
myFixture.configureFromExistingVirtualFile(file);
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.renameElementAtCaret("@+id/anchor1");
checkAndRename("@+id/anchor1");
myFixture.checkResultByFile(BASE_PATH + "layout_id_after.xml");
myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true);
}
@@ -224,7 +234,7 @@ public class AndroidRenameTest extends AndroidTestCase {
VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "layout6.xml", "res/layout/layout6.xml");
myFixture.configureFromExistingVirtualFile(file);
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.renameElementAtCaret("@+id/anchor1");
checkAndRename("@+id/anchor1");
myFixture.checkResultByFile(BASE_PATH + "layout_id_after.xml");
myFixture.checkResultByFile(R_JAVA_PATH, "R.java", true);
}
@@ -235,7 +245,7 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.configureFromExistingVirtualFile(file);
myFixture.copyFileToProject(BASE_PATH + "layout7.xml", "res/layout/layout7.xml");
myFixture.renameElementAtCaret("anchor1");
checkAndRename("anchor1");
myFixture.checkResultByFile(BASE_PATH + "RefR7_after.java", true);
myFixture.checkResultByFile("res/layout/layout7.xml", BASE_PATH + "layout_id_after.xml", true);
}
@@ -246,7 +256,7 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.configureFromExistingVirtualFile(file);
myFixture.copyFileToProject(BASE_PATH + "attrs8.xml", "res/values/attrs8.xml");
myFixture.renameElementAtCaret("LabelView1");
checkAndRename("LabelView1");
myFixture.checkResultByFile(BASE_PATH + "RefR8_after.java", true);
myFixture.checkResultByFile("res/values/attrs8.xml", BASE_PATH + "attrs8_after.xml", true);
}
@@ -257,7 +267,7 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject("R.java", R_JAVA_PATH);
myFixture.configureFromExistingVirtualFile(file);
myFixture.copyFileToProject(BASE_PATH + "attrs9.xml", "res/values/attrs9.xml");
myFixture.renameElementAtCaret("attr1");
checkAndRename("attr1");
myFixture.checkResultByFile(BASE_PATH + "RefR9_after.java", true);
myFixture.checkResultByFile("res/values/attrs9.xml", BASE_PATH + "attrs9_after.xml", true);
}
@@ -292,7 +302,7 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject(BASE_PATH + "MyWidget.java", "src/p1/p2/MyWidget.java");
VirtualFile file = myFixture.copyFileToProject(BASE_PATH + "layout_widget.xml", "res/layout/layout_widget.xml");
myFixture.configureFromExistingVirtualFile(file);
myFixture.renameElementAtCaret("MyWidget1");
checkAndRename("MyWidget1");
myFixture.checkResultByFile(BASE_PATH + "layout_widget_after.xml");
}
@@ -309,7 +319,7 @@ public class AndroidRenameTest extends AndroidTestCase {
myFixture.copyFileToProject(BASE_PATH + "MyActivity.java", "src/p1/p2/MyActivity.java");
VirtualFile manifestFile = myFixture.copyFileToProject(BASE_PATH + getTestName(false) + ".xml", SdkConstants.FN_ANDROID_MANIFEST_XML);
myFixture.configureFromExistingVirtualFile(manifestFile);
myFixture.renameElementAtCaret(newName);
checkAndRename(newName);
myFixture.checkResultByFile(BASE_PATH + getTestName(false) + "_after.xml");
}
@@ -322,9 +332,17 @@ public class AndroidRenameTest extends AndroidTestCase {
final PsiDirectory[] dirs = newParentPackage.getDirectories();
assertEquals(dirs.length, 1);
new MoveClassesOrPackagesProcessor(getProject(), new PsiElement[] {aPackage},
new MoveClassesOrPackagesProcessor(getProject(), new PsiElement[]{aPackage},
new SingleSourceRootMoveDestination(PackageWrapper.create(newParentPackage), dirs[0]),
true, false, null).run();
FileDocumentManager.getInstance().saveAllDocuments();
}
private void checkAndRename(String newName) {
final RenameElementAction action = new RenameElementAction();
final AnActionEvent e = new TestActionEvent(DataManager.getInstance().getDataContext(myFixture.getEditor().getComponent()), action);
action.update(e);
assertTrue(e.getPresentation().isEnabled() && e.getPresentation().isVisible());
myFixture.renameElementAtCaret(newName);
}
}
@@ -3,6 +3,9 @@ package org.jetbrains.android;
import com.intellij.codeInsight.navigation.actions.GotoDeclarationAction;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlAttributeValue;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
@@ -10,7 +13,8 @@ import java.io.IOException;
* @author Eugene.Kudelevsky
*/
public class AndroidResourcesLineMarkerTest extends AndroidTestCase {
public void test1() {}
public void test1() {
}
private static final String BASE_PATH = "/resNavigation/";
@@ -26,41 +30,60 @@ public class AndroidResourcesLineMarkerTest extends AndroidTestCase {
}
public void testJavaFileNavigation1() throws Exception {
doJavaFileNavigationTest(1, true);
doJavaFileNavigationTest(1, true, XmlAttributeValue.class);
}
public void testJavaFileNavigation2() throws Exception {
doJavaFileNavigationTest(3, true);
doJavaFileNavigationTest(3, true, XmlAttributeValue.class);
}
public void testJavaFileNavigation3() throws Exception {
doJavaFileNavigationTest(2, true);
doJavaFileNavigationTest(2, true, PsiFile.class);
}
public void testJavaFileNavigation4() throws Exception {
doJavaFileNavigationTest(0, false);
doJavaFileNavigationTest(0, false, null);
}
public void testJavaFileNavigation5() throws Exception {
doJavaFileNavigationTest(1, true);
doJavaFileNavigationTest(1, true, XmlAttributeValue.class);
}
public void testJavaFileNavigation6() throws Exception {
doJavaFileNavigationTest(1, true);
doJavaFileNavigationTest(1, true, XmlAttributeValue.class);
}
public void testJavaFileNavigation7() throws Exception {
doJavaFileNavigationTest(1, true);
doJavaFileNavigationTest(1, true, XmlAttributeValue.class);
}
private void doJavaFileNavigationTest(int expectedTargets, boolean expectedEnabled) throws IOException {
public void testJavaFileNavigation8() throws Exception {
doJavaFileNavigationTest(1, true, XmlAttributeValue.class);
}
public void testJavaFileNavigation9() throws Exception {
doJavaFileNavigationTest(1, true, XmlAttributeValue.class);
}
public void testJavaFileNavigation10() throws Exception {
doJavaFileNavigationTest(1, true, XmlAttributeValue.class);
}
public void testJavaFileNavigation11() throws Exception {
doJavaFileNavigationTest(1, true, XmlAttributeValue.class);
}
private void doJavaFileNavigationTest(int expectedTargets,
boolean expectedEnabled,
@Nullable Class<? extends PsiElement> targetElementClass)
throws IOException {
copyRJava();
String path = "src/p1/p2/" + getTestName(false) + ".java";
doJavaFileNavigationTest(path, path, expectedTargets, expectedEnabled, true);
doJavaFileNavigationTest(path, path, expectedTargets, expectedEnabled, true, targetElementClass);
}
private void doJavaFileNavigationTest(String srcPath, String destPath, int expectedTargets, boolean expectedEnabled,
boolean testGotoDeclaration) throws IOException {
boolean testGotoDeclaration, Class<? extends PsiElement> targetElementClass) throws IOException {
VirtualFile file = myFixture.copyFileToProject(BASE_PATH + srcPath, destPath);
myFixture.configureFromExistingVirtualFile(file);
@@ -69,6 +92,10 @@ public class AndroidResourcesLineMarkerTest extends AndroidTestCase {
PsiElement[] targets = GotoDeclarationAction.findAllTargetElements(getProject(), myFixture.getEditor(), myFixture.getCaretOffset());
assertNotNull(targets);
assertEquals(expectedTargets, targets.length);
for (PsiElement target : targets) {
assertInstanceOf(target, targetElementClass);
}
}
}
@@ -9,6 +9,7 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import org.jetbrains.android.inspections.CreateFileResourceQuickFix;
import org.jetbrains.android.inspections.CreateValueResourceQuickFix;
import java.io.IOException;
@@ -116,7 +117,8 @@ public class AndroidLayoutDomTest extends AndroidDomTest {
public void testResourceCompletion() throws Throwable {
doTestCompletionVariants("av3.xml", "@color/", "@android:", "@drawable/");
doTestCompletionVariants("av8.xml", "@android:", "@anim/", "@color/", "@dimen/", "@drawable/", "@id/", "@layout/", "@string/", "@style/");
doTestCompletionVariants("av8.xml", "@android:", "@anim/", "@color/", "@dimen/", "@drawable/", "@id/", "@layout/", "@string/",
"@style/");
}
public void testLocalResourceCompletion1() throws Throwable {
@@ -129,12 +131,12 @@ public class AndroidLayoutDomTest extends AndroidDomTest {
public void testLocalResourceCompletion3() throws Throwable {
doTestCompletionVariants("av7.xml", "@android:", "@string/hello", "@string/hello1", "@string/welcome", "@string/welcome1",
"@string/itStr");
"@string/itStr");
}
public void testLocalResourceCompletion4() throws Throwable {
doTestCompletionVariants("av7.xml", "@android:", "@string/hello", "@string/hello1", "@string/welcome", "@string/welcome1",
"@string/itStr");
"@string/itStr");
}
public void testLocalResourceCompletion5() throws Throwable {
@@ -346,7 +348,7 @@ public class AndroidLayoutDomTest extends AndroidDomTest {
for (HighlightInfo info : infos) {
final List<Pair<HighlightInfo.IntentionActionDescriptor, TextRange>> ranges = info.quickFixActionRanges;
if (ranges != null) {
for (Pair<HighlightInfo.IntentionActionDescriptor, TextRange> pair : ranges) {
final IntentionAction action = pair.getFirst().getAction();
@@ -430,5 +432,45 @@ public class AndroidLayoutDomTest extends AndroidDomTest {
copyFileToProject("main.xml", "res/layout/main.xml");
doTestJavaHighlighting("p1");
}
public void testJavaCreateResourceFromUsage() throws Throwable {
final VirtualFile virtualFile = copyFileToProject(getTestName(false) + ".java", "src/p1/p2/" + getTestName(true) + ".java");
doCreateFileResourceFromUsage(virtualFile);
myFixture.checkResultByFile("res/layout/unknown.xml", testFolder + '/' + getTestName(true) + "_layout_after.xml", true);
}
public void testCreateResourceFromUsage1() throws Throwable {
final VirtualFile virtualFile = copyFileToProject(getTestName(true) + ".xml");
doCreateFileResourceFromUsage(virtualFile);
myFixture.type("selector");
myFixture.checkResultByFile("res/drawable/unknown.xml", testFolder + '/' + getTestName(true) + "_drawable_after.xml", true);
}
private void doCreateFileResourceFromUsage(VirtualFile virtualFile) {
myFixture.configureFromExistingVirtualFile(virtualFile);
final List<HighlightInfo> infos = myFixture.doHighlighting();
final List<IntentionAction> actions = new ArrayList<IntentionAction>();
for (HighlightInfo info : infos) {
final List<Pair<HighlightInfo.IntentionActionDescriptor, TextRange>> ranges = info.quickFixActionRanges;
if (ranges != null) {
for (Pair<HighlightInfo.IntentionActionDescriptor, TextRange> pair : ranges) {
final IntentionAction action = pair.getFirst().getAction();
if (action instanceof CreateFileResourceQuickFix) {
actions.add(action);
}
}
}
}
assertEquals(1, actions.size());
new WriteCommandAction.Simple(getProject()) {
@Override
protected void run() throws Throwable {
actions.get(0).invoke(getProject(), myFixture.getEditor(), myFixture.getFile());
}
}.execute();
}
}
@@ -27,6 +27,8 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.refactoring.actions.InlineAction;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import org.jetbrains.android.inspections.CreateValueResourceQuickFix;
import java.util.ArrayList;
@@ -189,30 +191,7 @@ public class AndroidValueResourcesTest extends AndroidDomTest {
public void testCreateResourceFromUsage() throws Throwable {
final VirtualFile virtualFile = copyFileToProject(getTestName(true) + ".xml", "res/values/drawables.xml");
myFixture.configureFromExistingVirtualFile(virtualFile);
final List<HighlightInfo> infos = myFixture.doHighlighting();
final List<IntentionAction> actions = new ArrayList<IntentionAction>();
for (HighlightInfo info : infos) {
final List<Pair<HighlightInfo.IntentionActionDescriptor, TextRange>> ranges = info.quickFixActionRanges;
if (ranges != null) {
for (Pair<HighlightInfo.IntentionActionDescriptor, TextRange> pair : ranges) {
final IntentionAction action = pair.getFirst().getAction();
if (action instanceof CreateValueResourceQuickFix) {
actions.add(action);
}
}
}
}
assertEquals(1, actions.size());
new WriteCommandAction.Simple(getProject()) {
@Override
protected void run() throws Throwable {
actions.get(0).invoke(getProject(), myFixture.getEditor(), myFixture.getFile());
}
}.execute();
doCreateValueResourceFromUsage(virtualFile);
myFixture.checkResultByFile(testFolder + '/' + getTestName(true) + "_after.xml", true);
}
@@ -240,4 +219,56 @@ public class AndroidValueResourcesTest extends AndroidDomTest {
copyFileToProject("value_resources.xml", "res/values/value_resources.xml");
doTestJavaHighlighting("p1.p2");
}
public void testInlineResourceField() throws Exception {
copyFileToProject("value_resources.xml", "res/values/value_resources.xml");
final VirtualFile virtualFile = copyFileToProject(getTestName(false) + ".java", "src/p1/p2/" + getTestName(false) + ".java");
myFixture.configureFromExistingVirtualFile(virtualFile);
try {
myFixture.testAction(new InlineAction());
fail();
}
catch (CommonRefactoringUtil.RefactoringErrorHintException e) {
}
myFixture.checkResultByFile(testFolder + '/' + getTestName(false) + ".java", true);
}
public void testJavaCreateFromUsage() throws Throwable {
final VirtualFile virtualFile = copyFileToProject(getTestName(false) + ".java", "src/p1/p2/" + getTestName(false) + ".java");
doCreateValueResourceFromUsage(virtualFile);
myFixture.checkResultByFile("res/values/drawables.xml", testFolder + '/' + getTestName(true) + "_drawables_after.xml", true);
}
public void testJavaCreateFromUsage1() throws Throwable {
final VirtualFile virtualFile = copyFileToProject(getTestName(false) + ".java", "src/p1/p2/" + getTestName(false) + ".java");
doCreateValueResourceFromUsage(virtualFile);
myFixture.checkResultByFile("res/values/bools.xml", testFolder + '/' + getTestName(true) + "_bools_after.xml", true);
}
private void doCreateValueResourceFromUsage(VirtualFile virtualFile) {
myFixture.configureFromExistingVirtualFile(virtualFile);
final List<HighlightInfo> infos = myFixture.doHighlighting();
final List<IntentionAction> actions = new ArrayList<IntentionAction>();
for (HighlightInfo info : infos) {
final List<Pair<HighlightInfo.IntentionActionDescriptor, TextRange>> ranges = info.quickFixActionRanges;
if (ranges != null) {
for (Pair<HighlightInfo.IntentionActionDescriptor, TextRange> pair : ranges) {
final IntentionAction action = pair.getFirst().getAction();
if (action instanceof CreateValueResourceQuickFix) {
actions.add(action);
}
}
}
}
assertEquals(1, actions.size());
new WriteCommandAction.Simple(getProject()) {
@Override
protected void run() throws Throwable {
actions.get(0).invoke(getProject(), myFixture.getEditor(), myFixture.getFile());
}
}.execute();
}
}