Merge "Rewrite ClassStaticizerTest with new test builder."
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
index c184e6e..0794d92 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -9,9 +9,14 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+import com.android.tools.r8.ForceInline;
+import com.android.tools.r8.NeverInline;
import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.R8Command;
import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestRunResult;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.VmTestRunner;
@@ -36,13 +41,16 @@
import com.android.tools.r8.ir.optimize.staticizer.trivial.Simple;
import com.android.tools.r8.ir.optimize.staticizer.trivial.SimpleWithGetter;
import com.android.tools.r8.ir.optimize.staticizer.trivial.SimpleWithParams;
+import com.android.tools.r8.ir.optimize.staticizer.trivial.SimpleWithPhi;
import com.android.tools.r8.ir.optimize.staticizer.trivial.SimpleWithSideEffects;
import com.android.tools.r8.ir.optimize.staticizer.trivial.TrivialTestClass;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
+import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Streams;
import java.nio.file.Path;
@@ -50,26 +58,49 @@
import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
-@RunWith(VmTestRunner.class)
+@RunWith(Parameterized.class)
public class ClassStaticizerTest extends TestBase {
+ private Backend backend;
+
+ @Parameterized.Parameters(name = "Backend: {0}")
+ public static Backend[] data() {
+ return Backend.values();
+ }
+
+ public ClassStaticizerTest(Backend backend) {
+ this.backend = backend;
+ }
+
@Test
public void testTrivial() throws Exception {
- byte[][] classes = {
- ToolHelper.getClassAsBytes(TrivialTestClass.class),
- ToolHelper.getClassAsBytes(Simple.class),
- ToolHelper.getClassAsBytes(SimpleWithSideEffects.class),
- ToolHelper.getClassAsBytes(SimpleWithParams.class),
- ToolHelper.getClassAsBytes(SimpleWithGetter.class),
+ assumeTrue("b/112831361", backend == Backend.DEX);
+ Class<?> main = TrivialTestClass.class;
+ Class<?>[] classes = {
+ NeverInline.class,
+ TrivialTestClass.class,
+ Simple.class,
+ SimpleWithSideEffects.class,
+ SimpleWithParams.class,
+ SimpleWithGetter.class,
+ SimpleWithPhi.class,
+ SimpleWithPhi.Companion.class
};
- AndroidApp app = runR8(buildAndroidApp(classes), TrivialTestClass.class);
+ String javaOutput = runOnJava(main);
+ TestRunResult result = testForR8(backend)
+ .addProgramClasses(classes)
+ .enableProguardTestOptions()
+ .enableInliningAnnotations()
+ .addKeepMainRule(main)
+ .addKeepRules("-dontobfuscate", "-allowaccessmodification")
+ .addKeepRules("-keepattributes InnerClasses,EnclosingMethod")
+ .addOptionsModification(this::configure)
+ .run(main)
+ .assertSuccessWithOutput(javaOutput);
- String javaOutput = runOnJava(TrivialTestClass.class);
- String artOutput = runOnArt(app, TrivialTestClass.class);
- assertEquals(javaOutput, artOutput);
-
- CodeInspector inspector = new CodeInspector(app);
- ClassSubject clazz = inspector.clazz(TrivialTestClass.class);
+ CodeInspector inspector = result.inspector();
+ ClassSubject clazz = inspector.clazz(main);
assertEquals(
Lists.newArrayList(
@@ -82,6 +113,16 @@
assertEquals(
Lists.newArrayList(
+ "STATIC: String trivial.SimpleWithPhi.bar(String)",
+ "STATIC: String trivial.SimpleWithPhi.foo()",
+ "STATIC: String trivial.SimpleWithPhi.foo()",
+ "STATIC: String trivial.TrivialTestClass.next()"),
+ references(clazz, "testSimpleWithPhi", "void", "int"));
+
+ assertTrue(instanceMethods(inspector.clazz(SimpleWithPhi.class)).isEmpty());
+
+ assertEquals(
+ Lists.newArrayList(
"STATIC: String trivial.SimpleWithParams.bar(String)",
"STATIC: String trivial.SimpleWithParams.foo()",
"STATIC: String trivial.TrivialTestClass.next()"),
@@ -115,25 +156,33 @@
@Test
public void testMoveToHost() throws Exception {
- byte[][] classes = {
- ToolHelper.getClassAsBytes(MoveToHostTestClass.class),
- ToolHelper.getClassAsBytes(HostOk.class),
- ToolHelper.getClassAsBytes(CandidateOk.class),
- ToolHelper.getClassAsBytes(HostOkSideEffects.class),
- ToolHelper.getClassAsBytes(CandidateOkSideEffects.class),
- ToolHelper.getClassAsBytes(HostConflictMethod.class),
- ToolHelper.getClassAsBytes(CandidateConflictMethod.class),
- ToolHelper.getClassAsBytes(HostConflictField.class),
- ToolHelper.getClassAsBytes(CandidateConflictField.class),
+ assumeTrue("b/112831361", backend == Backend.DEX);
+ Class<?> main = MoveToHostTestClass.class;
+ Class<?>[] classes = {
+ NeverInline.class,
+ MoveToHostTestClass.class,
+ HostOk.class,
+ CandidateOk.class,
+ HostOkSideEffects.class,
+ CandidateOkSideEffects.class,
+ HostConflictMethod.class,
+ CandidateConflictMethod.class,
+ HostConflictField.class,
+ CandidateConflictField.class
};
- AndroidApp app = runR8(buildAndroidApp(classes), MoveToHostTestClass.class);
+ String javaOutput = runOnJava(main);
+ TestRunResult result = testForR8(backend)
+ .addProgramClasses(classes)
+ .enableProguardTestOptions()
+ .enableInliningAnnotations()
+ .addKeepMainRule(main)
+ .addKeepRules("-dontobfuscate", "-allowaccessmodification")
+ .addOptionsModification(this::configure)
+ .run(main)
+ .assertSuccessWithOutput(javaOutput);
- String javaOutput = runOnJava(MoveToHostTestClass.class);
- String artOutput = runOnArt(app, MoveToHostTestClass.class);
- assertEquals(javaOutput, artOutput);
-
- CodeInspector inspector = new CodeInspector(app);
- ClassSubject clazz = inspector.clazz(MoveToHostTestClass.class);
+ CodeInspector inspector = result.inspector();
+ ClassSubject clazz = inspector.clazz(main);
assertEquals(
Lists.newArrayList(
@@ -232,40 +281,6 @@
return type.toSourceString().startsWith("com.android.tools.r8.ir.optimize.staticizer");
}
- private AndroidApp runR8(AndroidApp app, Class mainClass) throws Exception {
- AndroidApp compiled =
- compileWithR8(app, getProguardConfig(mainClass.getCanonicalName()), this::configure);
-
- // Materialize file for execution.
- Path generatedDexFile = temp.getRoot().toPath().resolve("classes.jar");
- compiled.writeToZip(generatedDexFile, OutputMode.DexIndexed);
-
- // Run with ART.
- String artOutput = ToolHelper.runArtNoVerificationErrors(
- generatedDexFile.toString(), mainClass.getCanonicalName());
-
- // Compare with Java.
- ProcessResult javaResult = ToolHelper.runJava(
- ToolHelper.getClassPathForTests(), mainClass.getCanonicalName());
-
- if (javaResult.exitCode != 0) {
- System.out.println(javaResult.stdout);
- System.err.println(javaResult.stderr);
- fail("JVM failed for: " + mainClass);
- }
- assertEquals("JVM and ART output differ", javaResult.stdout, artOutput);
-
- return compiled;
- }
-
- private String getProguardConfig(String main) {
- return keepMainProguardConfiguration(main)
- + System.lineSeparator()
- + "-dontobfuscate"
- + System.lineSeparator()
- + "-allowaccessmodification";
- }
-
private void configure(InternalOptions options) {
options.enableClassInlining = false;
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictField.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictField.java
index f2108b0..82eef8e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictField.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictField.java
@@ -4,18 +4,18 @@
package com.android.tools.r8.ir.optimize.staticizer.movetohost;
+import com.android.tools.r8.NeverInline;
+
public class CandidateConflictField {
public static String field;
+ @NeverInline
public String foo() {
- synchronized ("") {
- return bar("CandidateConflictMethod::foo()");
- }
+ return bar("CandidateConflictMethod::foo()");
}
+ @NeverInline
public String bar(String other) {
- synchronized ("") {
- return "CandidateConflictMethod::bar(" + other + ")";
- }
+ return "CandidateConflictMethod::bar(" + other + ")";
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictMethod.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictMethod.java
index 40d0576..4e5ce3a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictMethod.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictMethod.java
@@ -4,16 +4,16 @@
package com.android.tools.r8.ir.optimize.staticizer.movetohost;
+import com.android.tools.r8.NeverInline;
+
public class CandidateConflictMethod {
+ @NeverInline
public String foo() {
- synchronized ("") {
- return bar("CandidateConflictMethod::foo()");
- }
+ return bar("CandidateConflictMethod::foo()");
}
+ @NeverInline
public String bar(String other) {
- synchronized ("") {
- return "CandidateConflictMethod::bar(" + other + ")";
- }
+ return "CandidateConflictMethod::bar(" + other + ")";
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOk.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOk.java
index daf5647..0834c000 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOk.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOk.java
@@ -4,22 +4,21 @@
package com.android.tools.r8.ir.optimize.staticizer.movetohost;
+import com.android.tools.r8.NeverInline;
+
public class CandidateOk {
+ @NeverInline
public String foo() {
- synchronized ("") {
- return bar("CandidateOk::foo()");
- }
+ return bar("CandidateOk::foo()");
}
+ @NeverInline
public String bar(String other) {
- synchronized ("") {
- return "CandidateOk::bar(" + other + ")";
- }
+ return "CandidateOk::bar(" + other + ")";
}
+ @NeverInline
public void blah(String other) {
- synchronized ("") {
- System.out.println("CandidateOk::blah(" + other + ")");
- }
+ System.out.println("CandidateOk::blah(" + other + ")");
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOkSideEffects.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOkSideEffects.java
index 2077056..a02bed3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOkSideEffects.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOkSideEffects.java
@@ -4,16 +4,16 @@
package com.android.tools.r8.ir.optimize.staticizer.movetohost;
+import com.android.tools.r8.NeverInline;
+
public class CandidateOkSideEffects {
+ @NeverInline
public String foo() {
- synchronized ("") {
- return bar("CandidateOkSideEffects::foo()");
- }
+ return bar("CandidateOkSideEffects::foo()");
}
+ @NeverInline
public String bar(String other) {
- synchronized ("") {
- return "CandidateOkSideEffects::bar(" + other + ")";
- }
+ return "CandidateOkSideEffects::bar(" + other + ")";
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/HostConflictMethod.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/HostConflictMethod.java
index ad86b35..8804e14 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/HostConflictMethod.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/HostConflictMethod.java
@@ -4,12 +4,13 @@
package com.android.tools.r8.ir.optimize.staticizer.movetohost;
+import com.android.tools.r8.NeverInline;
+
public class HostConflictMethod {
static CandidateConflictMethod INSTANCE = new CandidateConflictMethod();
+ @NeverInline
public String bar(String other) {
- synchronized ("") {
- return "HostConflictMethod::bar(" + other + ")";
- }
+ return "HostConflictMethod::bar(" + other + ")";
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostTestClass.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostTestClass.java
index 3f31839..3be6e5f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostTestClass.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostTestClass.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.optimize.staticizer.movetohost;
+import com.android.tools.r8.NeverInline;
+
public class MoveToHostTestClass {
private static int ID = 0;
@@ -19,24 +21,28 @@
test.testConflictField();
}
- private synchronized void testOk() {
+ @NeverInline
+ private void testOk() {
System.out.println(HostOk.INSTANCE.foo());
System.out.println(HostOk.INSTANCE.bar(next()));
HostOk.INSTANCE.blah(next());
}
- private synchronized void testOkSideEffects() {
+ @NeverInline
+ private void testOkSideEffects() {
System.out.println(HostOkSideEffects.INSTANCE.foo());
System.out.println(HostOkSideEffects.INSTANCE.bar(next()));
}
- private synchronized void testConflictMethod() {
+ @NeverInline
+ private void testConflictMethod() {
System.out.println(new HostConflictMethod().bar(next()));
System.out.println(HostConflictMethod.INSTANCE.foo());
System.out.println(HostConflictMethod.INSTANCE.bar(next()));
}
- private synchronized void testConflictField() {
+ @NeverInline
+ private void testConflictField() {
System.out.println(new HostConflictField().field);
System.out.println(CandidateConflictField.field);
System.out.println(HostConflictField.INSTANCE.foo());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/Simple.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/Simple.java
index 8df079c..3cb1c49 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/Simple.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/Simple.java
@@ -4,18 +4,18 @@
package com.android.tools.r8.ir.optimize.staticizer.trivial;
+import com.android.tools.r8.NeverInline;
+
public class Simple {
static Simple INSTANCE = new Simple();
+ @NeverInline
String foo() {
- synchronized ("") {
- return bar("Simple::foo()");
- }
+ return bar("Simple::foo()");
}
+ @NeverInline
String bar(String other) {
- synchronized ("") {
- return "Simple::bar(" + other + ")";
- }
+ return "Simple::bar(" + other + ")";
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithGetter.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithGetter.java
index 9ff20c3..55487ac 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithGetter.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithGetter.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.optimize.staticizer.trivial;
+import com.android.tools.r8.NeverInline;
+
public class SimpleWithGetter {
private static SimpleWithGetter INSTANCE = new SimpleWithGetter();
@@ -11,15 +13,13 @@
return INSTANCE;
}
+ @NeverInline
String foo() {
- synchronized ("") {
- return bar("Simple::foo()");
- }
+ return bar("Simple::foo()");
}
+ @NeverInline
String bar(String other) {
- synchronized ("") {
- return "Simple::bar(" + other + ")";
- }
+ return "Simple::bar(" + other + ")";
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithParams.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithParams.java
index a71f1f5..24edea4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithParams.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithParams.java
@@ -4,21 +4,21 @@
package com.android.tools.r8.ir.optimize.staticizer.trivial;
+import com.android.tools.r8.NeverInline;
+
public class SimpleWithParams {
static SimpleWithParams INSTANCE = new SimpleWithParams(123);
SimpleWithParams(int i) {
}
+ @NeverInline
String foo() {
- synchronized ("") {
- return bar("SimpleWithParams::foo()");
- }
+ return bar("SimpleWithParams::foo()");
}
+ @NeverInline
String bar(String other) {
- synchronized ("") {
- return "SimpleWithParams::bar(" + other + ")";
- }
+ return "SimpleWithParams::bar(" + other + ")";
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithPhi.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithPhi.java
new file mode 100644
index 0000000..f3c76cb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithPhi.java
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.ir.optimize.staticizer.trivial;
+
+import com.android.tools.r8.NeverInline;
+
+public class SimpleWithPhi {
+ public static class Companion {
+ @NeverInline
+ String foo() {
+ return bar("SimpleWithPhi$Companion::foo()");
+ }
+
+ @NeverInline
+ String bar(String other) {
+ return "SimpleWithPhi$Companion::bar(" + other + ")";
+ }
+ }
+
+ static Companion INSTANCE = new Companion();
+
+ @NeverInline
+ static String foo() {
+ return INSTANCE.foo();
+ }
+
+ @NeverInline
+ static String bar(String other) {
+ if (other.length() > 2) {
+ return INSTANCE.foo();
+ } else {
+ return INSTANCE.bar(other);
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithSideEffects.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithSideEffects.java
index 5ba97dc..2ee78f5 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithSideEffects.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithSideEffects.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.optimize.staticizer.trivial;
+import com.android.tools.r8.NeverInline;
+
public class SimpleWithSideEffects {
static SimpleWithSideEffects INSTANCE = new SimpleWithSideEffects();
@@ -11,15 +13,13 @@
System.out.println("SimpleWithSideEffects::<clinit>()");
}
+ @NeverInline
String foo() {
- synchronized ("") {
- return bar("SimpleWithSideEffects::foo()");
- }
+ return bar("SimpleWithSideEffects::foo()");
}
+ @NeverInline
String bar(String other) {
- synchronized ("") {
- return "SimpleWithSideEffects::bar(" + other + ")";
- }
+ return "SimpleWithSideEffects::bar(" + other + ")";
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/TrivialTestClass.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/TrivialTestClass.java
index 2dad273..964567c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/TrivialTestClass.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/TrivialTestClass.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.optimize.staticizer.trivial;
+import com.android.tools.r8.NeverInline;
+
public class TrivialTestClass {
private static int ID = 0;
@@ -14,27 +16,47 @@
public static void main(String[] args) {
TrivialTestClass test = new TrivialTestClass();
test.testSimple();
+ test.testSimpleWithPhi(args.length);
test.testSimpleWithSideEffects();
test.testSimpleWithParams();
test.testSimpleWithGetter();
}
- private synchronized void testSimple() {
+ @NeverInline
+ private void testSimple() {
System.out.println(Simple.INSTANCE.foo());
System.out.println(Simple.INSTANCE.bar(next()));
}
- private synchronized void testSimpleWithSideEffects() {
+ @NeverInline
+ private void testSimpleWithPhi(int arg) {
+ switch (arg) {
+ case 0:
+ System.out.println(SimpleWithPhi.foo() + " " + true);
+ break;
+ case 2:
+ System.out.println(SimpleWithPhi.foo() + " " + false);
+ break;
+ default:
+ System.out.println(SimpleWithPhi.bar(next()));
+ break;
+ }
+ }
+
+ @NeverInline
+ private void testSimpleWithSideEffects() {
System.out.println(SimpleWithSideEffects.INSTANCE.foo());
System.out.println(SimpleWithSideEffects.INSTANCE.bar(next()));
}
- private synchronized void testSimpleWithParams() {
+ @NeverInline
+ private void testSimpleWithParams() {
System.out.println(SimpleWithParams.INSTANCE.foo());
System.out.println(SimpleWithParams.INSTANCE.bar(next()));
}
- private synchronized void testSimpleWithGetter() {
+ @NeverInline
+ private void testSimpleWithGetter() {
System.out.println(SimpleWithGetter.getInstance().foo());
System.out.println(SimpleWithGetter.getInstance().bar(next()));
}