ui:import tags now have highest precedence in the generated code

Bug-Link: https://github.com/gwtproject/gwt/issues/8617
Change-Id: Id09ffbe53637151b7a881251b106a8238ea47206
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
index 4b01963..7e167fb 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
@@ -435,8 +435,8 @@
       fieldType = (JClassType) importType;
     }
 
-    FieldWriter fieldWriter = fieldManager.registerField(fieldType,
-        constantName);
+    FieldWriter fieldWriter = fieldManager.registerField(
+        FieldWriterType.IMPORTED, fieldType, constantName);
     fieldWriter.setInitializer(rawFieldName);
   }
 
diff --git a/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java b/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
index cb727cd..8a86fe2 100644
--- a/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
+++ b/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
@@ -54,6 +54,7 @@
 import com.google.gwt.uibinder.rebind.HandlerEvaluatorTest;
 import com.google.gwt.uibinder.rebind.TokenatorTest;
 import com.google.gwt.uibinder.rebind.TypeOracleUtilsTest;
+import com.google.gwt.uibinder.rebind.UiBinderParserUiImportTest;
 import com.google.gwt.uibinder.rebind.UiBinderParserUiWithTest;
 import com.google.gwt.uibinder.rebind.UiRendererEventValidationTest;
 import com.google.gwt.uibinder.rebind.UiRendererValidationTest;
@@ -84,6 +85,7 @@
     suite.addTestSuite(DesignTimeUtilsTest.class);
     suite.addTestSuite(TypeOracleUtilsTest.class);
     suite.addTestSuite(UiBinderParserUiWithTest.class);
+    suite.addTestSuite(UiBinderParserUiImportTest.class);
     suite.addTestSuite(UiRendererEventValidationTest.class);
     suite.addTestSuite(UiRendererValidationTest.class);
     suite.addTestSuite(HtmlTemplatesTest.class);
diff --git a/user/test/com/google/gwt/uibinder/rebind/UiBinderParserUiImportTest.java b/user/test/com/google/gwt/uibinder/rebind/UiBinderParserUiImportTest.java
new file mode 100644
index 0000000..9c9fe05
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/rebind/UiBinderParserUiImportTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed 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 com.google.gwt.uibinder.rebind;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.CompilerContext;
+import com.google.gwt.dev.javac.CompilationState;
+import com.google.gwt.dev.javac.CompilationStateBuilder;
+import com.google.gwt.dev.javac.testing.impl.MockJavaResource;
+import com.google.gwt.dev.javac.testing.impl.MockResourceOracle;
+import com.google.gwt.dev.resource.Resource;
+import com.google.gwt.dev.resource.ResourceOracle;
+import com.google.gwt.dev.util.collect.HashSet;
+import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
+import com.google.gwt.resources.rg.GssResourceGenerator.AutoConversionMode;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
+import com.google.gwt.uibinder.attributeparsers.AttributeParsers;
+import com.google.gwt.uibinder.test.UiJavaResources;
+
+import junit.framework.TestCase;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXParseException;
+
+import java.io.PrintWriter;
+import java.util.Set;
+
+/**
+ * Tests UiBinderParser behavior for <ui:import> tag.
+ */
+public class UiBinderParserUiImportTest extends TestCase {
+
+  public static final MockJavaResource BAR = new MockJavaResource("bar.Bar") {
+    @Override
+    public CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package bar;");
+      code.append("public class Bar {");
+      code.append("  public static String s = \"testString\";");
+      code.append("  public Bar(int a) { }");
+      code.append("}");
+      return code;
+    }
+  };
+
+  public static final MockJavaResource RENDERER = new MockJavaResource("renderer.OwnerClass") {
+    @Override
+    public CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package renderer;\n");
+      code.append("import com.google.gwt.safehtml.shared.SafeHtmlBuilder;\n");
+      code.append("import com.google.gwt.uibinder.client.UiRenderer;\n");
+      code.append("public class OwnerClass {");
+      code.append("  public interface Renderer");
+      code.append("      extends UiRenderer {");
+      code.append("    public void render(SafeHtmlBuilder sb);");
+      code.append("  }");
+      code.append("}");
+      return code;
+    }
+  };
+
+  private static final W3cDomHelper docHelper = new W3cDomHelper(TreeLogger.NULL,
+      new MockResourceOracle());
+
+  private static TreeLogger createCompileLogger() {
+    PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new PrintWriter(System.err, true));
+    logger.setMaxDetail(TreeLogger.ERROR);
+    return logger;
+  }
+
+  UiBinderParser parser;
+  private Document doc;
+  private XMLElementProvider elemProvider;
+
+  private XMLElement elm;
+
+  private FieldManager fieldManager;
+
+  private Element item;
+
+  private MockMortalLogger logger;
+
+  private Set<Resource> resources = new HashSet<Resource>();
+
+  private TypeOracle types;
+
+  private UiBinderWriter writer;
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    resources.addAll(UiJavaResources.getUiResources());
+    resources.add(BAR);
+    resources.add(RENDERER);
+    CompilationState state =
+        CompilationStateBuilder.buildFrom(createCompileLogger(), new CompilerContext(), resources);
+    types = state.getTypeOracle();
+    logger = new MockMortalLogger();
+    fieldManager = new FieldManager(types, logger, true);
+  }
+
+  public void testUiImportHasTypeImported()
+      throws UnableToCompleteException, SAXParseException {
+    init("<doc><import field=\"bar.Bar.s\"/></doc>", "renderer.OwnerClass.Renderer");
+
+    assertNotNull(fieldManager.lookup("s"));
+    assertTrue("ui:import field must have type IMPORTED",
+            fieldManager.lookup("s").getFieldType().equals(FieldWriterType.IMPORTED));
+  }
+
+  private void init(String domString, String baseClass) throws SAXParseException,
+      UnableToCompleteException {
+    DesignTimeUtils designTime = DesignTimeUtilsStub.EMPTY;
+    elemProvider =
+        new XMLElementProviderImpl(new AttributeParsers(types, null, logger), types,
+            logger, designTime);
+    doc = docHelper.documentFor(domString, null);
+    item = (Element) doc.getDocumentElement().getElementsByTagName("import").item(0);
+    elm = elemProvider.get(item);
+    JClassType aClass = types.findType(baseClass);
+    ResourceOracle resourceOracle = new MockResourceOracle();
+    GssOptions gssOptions = new GssOptions(true, AutoConversionMode.OFF, true);
+    writer = new UiBinderWriter(aClass, "bar", "", types, logger, fieldManager, null,
+        DesignTimeUtilsStub.EMPTY, new UiBinderContext(), true, true, "", resourceOracle,
+        gssOptions);
+    parser = new UiBinderParser(writer, null, fieldManager, types, null, "", new UiBinderContext(),
+        resourceOracle, gssOptions);
+    designTime.rememberPathForElements(doc);
+    UiBinderParser.Resource.IMPORT.create(parser, elm);
+  }
+}