diff --git a/build.gradle.kts b/build.gradle.kts index 614495f46..9df5b7f98 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -44,6 +44,8 @@ plugins { // Without `apply false`, the plugin is automatically applied to the main "jar" task, which somehow interferes with // the "spotbugsMain" task, causing it to fail. Instead, we will create a separate task to generate the bundle info. id("biz.aQute.bnd.builder") version "6.4.0" apply false + + id("me.champeau.jmh") version "0.7.2" } jacoco { diff --git a/settings.gradle.kts b/settings.gradle.kts index 054e32e32..89ea6b1f1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,3 +6,4 @@ plugins { rootProject.name = "ion-java" include("ion-java-cli") +include("jmh") diff --git a/src/jmh/java/com/amazon/ion/IonValueGetTypeBenchmark.java b/src/jmh/java/com/amazon/ion/IonValueGetTypeBenchmark.java new file mode 100644 index 000000000..518c0b9f0 --- /dev/null +++ b/src/jmh/java/com/amazon/ion/IonValueGetTypeBenchmark.java @@ -0,0 +1,101 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package com.amazon.ion; + + +import com.amazon.ion.system.IonSystemBuilder; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +import java.io.IOException; +import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Fork(1) +@Warmup(iterations = 3, time = 10, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS) +@State(Scope.Benchmark) +public class IonValueGetTypeBenchmark { + + private static final IonSystem SYSTEM = IonSystemBuilder.standard().build(); + + private final IonBool bool = SYSTEM.newBool(false); + private final IonInt integer = SYSTEM.newInt(123); + private final IonNull ionNull = SYSTEM.newNull(); + private final IonFloat ionFloat = SYSTEM.newFloat(42); + private final IonDecimal ionDecimal = SYSTEM.newDecimal(1.23); + private final IonString string = SYSTEM.newString("abc"); + private final IonSymbol symbol = SYSTEM.newSymbol("def"); + private final IonBlob blob = SYSTEM.newBlob(new byte[]{}); + private final IonClob clob = SYSTEM.newClob(new byte[]{}); + private final IonStruct struct = SYSTEM.newEmptyStruct(); + private final IonList list = SYSTEM.newEmptyList(); + private final IonSexp sexp = SYSTEM.newEmptySexp(); + private final IonDatagram dg = SYSTEM.newDatagram(); + + @Benchmark + public int ionValueGetType() { + return integer.getType().ordinal() + + bool.getType().ordinal() + + ionNull.getType().ordinal() + + ionFloat.getType().ordinal() + + ionDecimal.getType().ordinal() + + string.getType().ordinal() + + symbol.getType().ordinal() + + blob.getType().ordinal() + + clob.getType().ordinal() + + struct.getType().ordinal() + + list.getType().ordinal() + + sexp.getType().ordinal() + + dg.getType().ordinal(); + } + + private final IonDatagram container; + private Blackhole bh; + + public IonValueGetTypeBenchmark() { + try { + container = SYSTEM.getLoader().load(Paths.get("ion-tests/iontestdata/good/message2.ion").toFile()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Setup + public void setup(Blackhole bh) { + this.bh = bh; + } + + @Benchmark + public void getTypeContainer() { + getTypeRecursive(container); + } + + public void getTypeRecursive(IonContainer container) { + bh.consume(container.getType()); + for (IonValue child : container) { + IonType type = child.getType(); + bh.consume(type); + switch (type) { + case STRUCT: + case LIST: + case SEXP: + getTypeRecursive((IonContainer) child); + break; + default: + break; + } + } + } +} diff --git a/src/main/java/com/amazon/ion/impl/lite/IonBlobLite.java b/src/main/java/com/amazon/ion/impl/lite/IonBlobLite.java index baffccb7e..bcab70da3 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonBlobLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonBlobLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.IonBlob; @@ -67,7 +54,7 @@ int scalarHashCode() { } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.BLOB; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonBoolLite.java b/src/main/java/com/amazon/ion/impl/lite/IonBoolLite.java index 2ceab4391..2429a72f7 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonBoolLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonBoolLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.IonBool; @@ -68,7 +55,7 @@ public IonBoolLite clone() } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.BOOL; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonClobLite.java b/src/main/java/com/amazon/ion/impl/lite/IonClobLite.java index aa55dd773..702d29f88 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonClobLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonClobLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.IonClob; @@ -70,7 +57,7 @@ int scalarHashCode() { } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.CLOB; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonDatagramLite.java b/src/main/java/com/amazon/ion/impl/lite/IonDatagramLite.java index 4f37ec801..6edf35a66 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonDatagramLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonDatagramLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import static com.amazon.ion.SystemSymbols.ION_1_0; @@ -386,7 +373,7 @@ public IonSystemLite getSystem() } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.DATAGRAM; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonDecimalLite.java b/src/main/java/com/amazon/ion/impl/lite/IonDecimalLite.java index 395c016a5..0358a0f06 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonDecimalLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonDecimalLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.Decimal; @@ -105,7 +92,7 @@ int scalarHashCode() } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.DECIMAL; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonFloatLite.java b/src/main/java/com/amazon/ion/impl/lite/IonFloatLite.java index 829a0c3a6..61a98b97f 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonFloatLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonFloatLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.Decimal; @@ -76,7 +63,7 @@ int scalarHashCode() } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.FLOAT; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonIntLite.java b/src/main/java/com/amazon/ion/impl/lite/IonIntLite.java index 37b290074..ec3cdc93d 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonIntLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonIntLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.IntegerSize; @@ -107,7 +94,7 @@ int scalarHashCode() } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.INT; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonListLite.java b/src/main/java/com/amazon/ion/impl/lite/IonListLite.java index 0a1dc088a..c14b64474 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonListLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonListLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.ContainedValueException; @@ -81,7 +68,7 @@ int hashSignature() { } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.LIST; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonNullLite.java b/src/main/java/com/amazon/ion/impl/lite/IonNullLite.java index bb959b4f7..0d9211669 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonNullLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonNullLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.IonNull; @@ -58,7 +45,7 @@ public IonNullLite clone() } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.NULL; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonSexpLite.java b/src/main/java/com/amazon/ion/impl/lite/IonSexpLite.java index e9d61233a..4da7c77d3 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonSexpLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonSexpLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.ContainedValueException; @@ -75,7 +62,7 @@ int hashSignature() { } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.SEXP; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonStringLite.java b/src/main/java/com/amazon/ion/impl/lite/IonStringLite.java index 99d3d227a..199eb1872 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonStringLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonStringLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.IonString; @@ -70,7 +57,7 @@ int scalarHashCode() } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.STRING; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonStructLite.java b/src/main/java/com/amazon/ion/impl/lite/IonStructLite.java index 2bd4f1715..f72b73434 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonStructLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonStructLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import com.amazon.ion.ContainedValueException; @@ -345,7 +332,7 @@ else if (_children == null) { @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.STRUCT; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonSymbolLite.java b/src/main/java/com/amazon/ion/impl/lite/IonSymbolLite.java index 15bbd3e68..b9d38554e 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonSymbolLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonSymbolLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import static com.amazon.ion.SymbolTable.UNKNOWN_SYMBOL_ID; @@ -124,7 +111,7 @@ int scalarHashCode() } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.SYMBOL; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonTimestampLite.java b/src/main/java/com/amazon/ion/impl/lite/IonTimestampLite.java index 2eb8b4d79..b6c286e46 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonTimestampLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonTimestampLite.java @@ -64,7 +64,7 @@ int scalarHashCode() { } @Override - public IonType getType() + public IonType getTypeSlow() { return IonType.TIMESTAMP; } diff --git a/src/main/java/com/amazon/ion/impl/lite/IonValueLite.java b/src/main/java/com/amazon/ion/impl/lite/IonValueLite.java index e80b54833..08fd6661f 100644 --- a/src/main/java/com/amazon/ion/impl/lite/IonValueLite.java +++ b/src/main/java/com/amazon/ion/impl/lite/IonValueLite.java @@ -1,18 +1,5 @@ -/* - * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file 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. - */ - +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazon.ion.impl.lite; import static com.amazon.ion.SymbolTable.UNKNOWN_SYMBOL_ID; @@ -842,11 +829,27 @@ public IonSystemLite getSystem() return _context.getSystem(); } - public IonType getType() + public final IonType getType() { - throw new UnsupportedOperationException("this type "+this.getClass().getSimpleName()+" should not be instantiated, there is not IonType associated with it"); + Class clazz = this.getClass(); + // IonStructLite is chosen for the fast path because it is the most commonly used container type as well as + // one of the most common of all types. This is important because internal usages of IonValue.getType() occur + // on container values much more often than on scalars. Do not remove or add special case branches here without + // a thorough study of the performance implications. + if (clazz == IonStructLite.class) { + return IonType.STRUCT; + } + return getTypeSlow(); } + /** + * @see #getType() + * This variant is considered "slow" because it is an abstract method with 14 implementations, meaning that it + * is invoked using a vtable lookup. + * @return the value's type. + */ + abstract IonType getTypeSlow(); + public SymbolToken[] getTypeAnnotationSymbols() { return getTypeAnnotationSymbols(new LazySymbolTableProvider(this));