You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2019/11/05 22:33:21 UTC

[groovy] branch GROOVY-7996 updated (5a60495 -> 3a9b12a)

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a change to branch GROOVY-7996
in repository https://gitbox.apache.org/repos/asf/groovy.git.


 discard 5a60495  GROOVY-8721, GROOVY-9015: Avoid calling ClassNode#getTypeClass()
 discard cceb7f8  Avoid potential invalid syntax (#1067)
 discard 0634480  minor edits
 discard b6e193d  refactor code
 discard 30e149d  sync with groovy-eclipse
 discard 9a8879b  Add more tests
 discard 652954b  GROOVY-8507, GROOVY-9301: support comma on last enum value in more cases
 discard a883a25  GROOVY-9303: Bump javaparser to 3.15.4
 discard a5f478d  Refactor code
 discard 4fa3a3e  Minor refactoring: move `ModifierNode` to `org.codehaus.groovy.ast` (#1064)
 discard d2ce017  Trivial refactoring: avoid redundant checks
 discard a406de3  Trivial refactoring: avoid redundant operations on list
 discard efb6a4a  Trivial refactoring: remove unnecessary check and cast
 discard afd3b01  Trivial refactoring: Can be replaced with `size() != 1`
 discard e7ced3a  Trivial refactoring: replaced with empty array
 discard 7d72423  Trivial refactoring: Comparator combinator can be used
 discard 3205209  Trivial refactoring: `Collections.sort()` can be replaced with `List.sort()`
 discard e2ad847  Trivial refactoring: Anonymous type has shorter lambda alternative
 discard 3c5577e  Minor refactoring: 'while' loop can be replaced with 'foreach'
 discard 55abd44  Minor refactoring: 'for' loop can be replaced with 'foreach'
 discard c546fa3  Fix "java.lang.RuntimeException: No suitable ClassLoader found for grab" caused by refactoring
 discard 82a9d78  Fix javadoc errors
 discard c59eb27  Trivial refactoring: remove unused imports
 discard 060d2c8  Trivial refactoring: Can be replaced with single 'Map.computeIfAbsent' method call
 discard a6d8e34  Trivial refactoring: Can be replaced with single 'Map.replaceAll' method call
 discard 37146c0  Minor refactoring: Lambda can be replaced with method reference
 discard 6238063  Minor refactoring: Anonymous type can be replaced with method reference
 discard 2b2e533  Minor refactoring: Anonymous type can be replaced with lambda expression
 discard e91706c  Trivial refactoring: cleanup `CachedClass`
 discard 1f93e49  Refactor code
 discard fa0d56c  Tweak javadoc
 discard aef5c2e  Support better extensibility for caller class
 discard 87fc5b6  Fix the caller class
 discard a6965b2  Java 8 refactor
 discard e00c513  Minor refactor: remove legacy code
 discard 35259df  Java 8 refactor
 discard 2c98166  Minor refactoring: pull the implementation up to super class
 discard 5065e83  Fix illegal access warning `java.util.Observable.changed`
 discard cc1d277  Fix unchecked warning
 discard 7f20ad3  Fix the hardcoded caller class
 discard f44c4a2  Add one more test for `with` under STC mode
 discard 096df8a  Add a test for `with` under STC mode
 discard 09d30f2  Prefer jars over class folders on the compile classpath
 discard bb3574d  GROOVY-9300: Bump gradle to 5.6.4
 discard f20ca3a  Refactor code
 discard 2f6333f  Show illegal access warnings without detailed messages.
 discard d0d80eb  GROOVY-9298: Eliminate some illegal access warnings when indy is enabled (#1058)
 discard 16fa834  java 8 refacotor
 discard 013c7d7  GROOVY-8457: use ClassHelper.make(Class) for resolved exception type
 discard 81392b7  GROOVY-9257: ZipException, FNFE -> IOException, InvalidPathException
 discard a39f06d  refactor @NotYetImplemented AST transform
 discard 08cf66c  GROOVY-9297: Bump javaparser to 3.15.3
 discard f373212  GROOVY-8517: add getNodeMetaData(Object,Function)
 discard 5a864ee  sync with groovy-eclipse
 discard d6a556b  Add a test for GROOVY-8223 (#1055)
 discard c261b92  Trivial refactoring: remove redundant checks
 discard 722caef  Use `org.objectweb.asm.Opcodes`
 discard 7456822  Java 8 refactor (closes #1053)
 discard c945c39  Ensure reader is closed
 discard c3abf8b  Ignore test which fails for default builds but works for invoke-dynamic
 discard c396c77  GROOVY-9195: SC: uniform treatment for "foo.bar" and "foo.with { bar }"
 discard 491ea93  trivial refactor
 discard 24148d0  trivial refactor
    omit 91b8149  GROOVY-7996: check for get(String)/set(String,Object) or propertyMissing
     new 3a9b12a  GROOVY-7996: check for get(String)/set(String,Object) or propertyMissing

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (5a60495)
            \
             N -- N -- N   refs/heads/GROOVY-7996 (3a9b12a)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 build.gradle                                       |    2 +-
 gradle.properties                                  |    5 +-
 gradle/wrapper/gradle-wrapper.properties           |    2 +-
 src/antlr/GroovyParser.g4                          |   16 +-
 src/main/antlr2/org/codehaus/groovy/antlr/groovy.g |   15 +-
 .../groovy/grape/GrabAnnotationTransformation.java |   11 +-
 src/main/java/groovy/inspect/Inspector.java        |    3 +-
 .../java/groovy/lang/BenchmarkInterceptor.java     |    6 +-
 src/main/java/groovy/lang/ExpandoMetaClass.java    |  140 +--
 src/main/java/groovy/lang/GroovyClassLoader.java   |  127 ++-
 src/main/java/groovy/lang/GroovyCodeSource.java    |   28 +-
 src/main/java/groovy/lang/GroovyShell.java         |   36 +-
 src/main/java/groovy/lang/MetaClassImpl.java       |   86 +-
 src/main/java/groovy/lang/ProxyMetaClass.java      |   24 +-
 .../java/groovy/util/FactoryBuilderSupport.java    |   15 +-
 src/main/java/groovy/util/GroovyScriptEngine.java  |   40 +-
 src/main/java/groovy/util/NodeList.java            |    2 +-
 src/main/java/groovy/util/ObjectGraphBuilder.java  |   70 +-
 src/main/java/groovy/util/ProxyGenerator.java      |   14 +-
 .../internal/util/ReevaluatingReference.java       |   13 +-
 .../java/org/apache/groovy/metaclass/Realm.java    |   15 +-
 .../util/concurrentlinkedhashmap/Weighers.java     |    8 +-
 src/main/java/org/codehaus/groovy/antlr/Main.java  |   31 +-
 .../groovy/antlr/java/Java2GroovyProcessor.java    |    5 +-
 .../groovy/antlr/treewalker/CompositeVisitor.java  |   20 +-
 .../antlr/treewalker/FlatNodeListTraversal.java    |    8 +-
 .../java/org/codehaus/groovy/ast/CompileUnit.java  |   22 +-
 .../org/codehaus/groovy/ast/GroovyCodeVisitor.java |   10 +-
 .../java/org/codehaus/groovy/ast/ImportNode.java   |    5 +-
 .../java/org/codehaus/groovy/ast/MethodNode.java   |    3 +-
 .../java/org/codehaus/groovy/ast/ModuleNode.java   |   98 +-
 .../codehaus/groovy/ast/NodeMetaDataHandler.java   |   42 +-
 .../java/org/codehaus/groovy/ast/Parameter.java    |   21 +-
 .../groovy/ast/decompiled/AsmDecompiler.java       |    5 +-
 .../groovy/ast/expr/ArgumentListExpression.java    |    3 +-
 .../codehaus/groovy/ast/tools/GeneralUtils.java    |    9 -
 .../codehaus/groovy/ast/tools/GenericsUtils.java   |    4 +-
 .../groovy/ast/tools/WideningCategories.java       |   32 +-
 .../groovy/classgen/AsmClassGenerator.java         |   73 +-
 .../codehaus/groovy/classgen/BytecodeSequence.java |    7 +-
 .../groovy/classgen/DummyClassGenerator.java       |    9 +-
 .../org/codehaus/groovy/classgen/EnumVisitor.java  |    2 +
 .../codehaus/groovy/classgen/ExtendedVerifier.java |   23 +-
 .../classgen/InnerClassCompletionVisitor.java      |    4 +-
 .../org/codehaus/groovy/classgen/ReturnAdder.java  |   11 +-
 .../groovy/classgen/VariableScopeVisitor.java      |    7 +-
 .../org/codehaus/groovy/classgen/Verifier.java     |    7 +-
 .../groovy/classgen/asm/BytecodeHelper.java        |  153 +--
 .../groovy/classgen/asm/ClosureWriter.java         |    6 +-
 .../codehaus/groovy/classgen/asm/CompileStack.java |    9 +-
 .../groovy/classgen/asm/InvocationWriter.java      |   32 +-
 .../codehaus/groovy/classgen/asm/MethodCaller.java |    3 +-
 .../groovy/classgen/asm/StatementWriter.java       |   24 +-
 .../asm/sc/StaticCompilationMopWriter.java         |    7 +-
 .../classgen/asm/sc/StaticInvocationWriter.java    |   30 +-
 .../classgen/asm/sc/StaticTypesCallSiteWriter.java |  203 ++--
 .../groovy/control/CompilerConfiguration.java      |  151 ++-
 .../codehaus/groovy/control/ErrorCollector.java    |   12 +-
 .../java/org/codehaus/groovy/control/Janitor.java  |    6 +-
 .../org/codehaus/groovy/control/LabelVerifier.java |    9 +-
 .../codehaus/groovy/control/ProcessingUnit.java    |   17 +-
 .../codehaus/groovy/control/ResolveVisitor.java    |    8 +-
 .../org/codehaus/groovy/control/SourceUnit.java    |   14 +-
 .../groovy/control/StaticImportVisitor.java        |   25 +-
 .../groovy/control/messages/LocatedMessage.java    |   14 +-
 .../codehaus/groovy/reflection/CachedClass.java    |   78 +-
 .../groovy/reflection/CachedConstructor.java       |    3 +-
 .../org/codehaus/groovy/reflection/ClassInfo.java  |    6 +-
 .../reflection/ClassLoaderForClassArtifacts.java   |    6 +-
 .../groovy/reflection/ReflectionUtils.java         |   27 +-
 .../codehaus/groovy/reflection/SunClassLoader.java |   12 +-
 .../reflection/stdclasses/CachedSAMClass.java      |    9 +-
 .../groovy/runtime/DefaultGroovyMethods.java       |   27 +-
 .../groovy/runtime/EncodingGroovyMethods.java      |    4 +-
 .../org/codehaus/groovy/runtime/InvokerHelper.java |   21 +-
 .../groovy/runtime/ProcessGroovyMethods.java       |   52 +-
 .../groovy/runtime/ProxyGeneratorAdapter.java      |    6 +-
 .../groovy/runtime/ScriptBytecodeAdapter.java      |    4 +-
 .../groovy/runtime/SocketGroovyMethods.java        |    6 +-
 .../groovy/runtime/callsite/CallSiteGenerator.java |   44 +-
 .../runtime/callsite/GroovySunClassLoader.java     |   16 +-
 .../runtime/callsite/PogoMetaMethodSite.java       |    2 +-
 .../runtime/callsite/PojoMetaMethodSite.java       |    2 +-
 .../groovy/runtime/metaclass/ClosureMetaClass.java |   44 +-
 .../runtime/metaclass/ConcurrentReaderHashMap.java |  108 ++-
 .../runtime/metaclass/MetaClassRegistryImpl.java   |   62 +-
 .../groovy/runtime/metaclass/MetaMethodIndex.java  |    4 +-
 .../runtime/powerassert/AssertionRenderer.java     |    6 +-
 .../java/org/codehaus/groovy/syntax/CSTNode.java   |   14 +-
 .../codehaus/groovy/tools/FileSystemCompiler.java  |    4 +-
 .../org/codehaus/groovy/tools/GroovyClass.java     |   15 +-
 .../org/codehaus/groovy/tools/GroovyStarter.java   |    6 +-
 .../groovy/tools/javac/JavaStubGenerator.java      |    6 +-
 .../groovy/tools/shell/util/MessageSource.java     |   11 +-
 .../transform/AnnotationCollectorTransform.java    |   76 +-
 .../transform/MapConstructorASTTransformation.java |    7 +-
 .../transform/SortableASTTransformation.java       |    9 +-
 .../transform/ToStringASTTransformation.java       |    9 +-
 .../TupleConstructorASTTransformation.java         |    9 +-
 .../stc/AbstractExtensionMethodCache.java          |    4 +-
 .../stc/GroovyTypeCheckingExtensionSupport.java    |    6 +-
 .../transform/stc/StaticTypeCheckingSupport.java   |    5 +-
 .../transform/stc/StaticTypeCheckingVisitor.java   |   60 +-
 .../groovy/util/AbstractConcurrentMap.java         |   12 +-
 .../groovy/util/AbstractConcurrentMapBase.java     |  100 +-
 .../groovy/util/ManagedConcurrentLinkedQueue.java  |    4 +-
 .../org/codehaus/groovy/util/ReferenceManager.java |   38 +-
 .../org/codehaus/groovy/vmplugin/VMPlugin.java     |   12 +-
 .../codehaus/groovy/vmplugin/v5/JUnit4Utils.java   |    6 +-
 .../org/codehaus/groovy/vmplugin/v5/Java5.java     |    5 -
 .../v7/IndyGuardsFiltersAndSignatures.java         |    5 +-
 .../codehaus/groovy/vmplugin/v7/IndyInterface.java |    8 +-
 .../org/codehaus/groovy/vmplugin/v7/Java7.java     |   18 +-
 .../org/codehaus/groovy/vmplugin/v7/Selector.java  |   15 +-
 .../org/codehaus/groovy/vmplugin/v9/Java9.java     |   57 +-
 src/test/groovy/GroovyMethodsTest.groovy           |    9 +-
 src/test/groovy/bugs/Groovy2365Bug.java            |   38 +-
 src/test/groovy/bugs/Groovy8223.groovy             |   48 -
 src/test/groovy/bugs/Groovy9136.groovy             |   14 +-
 src/test/groovy/bugs/Groovy9288.groovy             |  111 +--
 src/test/groovy/bugs/Groovy9292.groovy             |  359 -------
 src/test/groovy/bugs/Groovy9292Bug.groovy          | 1008 ++++++++++++++++++++
 src/test/groovy/bugs/Groovy9293.groovy             |   11 +-
 src/test/groovy/bugs/groovy9081/Groovy9081.groovy  |   16 +-
 src/test/groovy/security/SecurityTest.java         |    9 +-
 src/test/groovy/security/SecurityTestSupport.java  |   55 +-
 .../stc/FieldsAndPropertiesSTCTest.groovy          |   42 +-
 src/test/groovy/transform/stc/WithSTCTest.groovy   |   28 -
 .../groovy/antlr/EnumSourceParsingTest.java        |  284 ++----
 .../classgen/ClassCompletionVerifierTest.java      |    2 +-
 .../groovy/classgen/ReflectorGeneratorTest.java    |    4 +-
 .../org/codehaus/groovy/classgen/TestSupport.java  |   14 +-
 .../groovy/classgen/asm/sc/bugs/Groovy7300.groovy  |   74 --
 .../{Groovy7316Bug.groovy => Groovy7300Bug.groovy} |   63 +-
 .../asm/sc/bugs/support/Groovy7133Support.java     |    3 +-
 .../asm/sc/bugs/support/Groovy7538Support.java     |    4 +-
 .../groovy/runtime/memoize/CommonCacheTest.java    |    7 +-
 .../runtime/memoize/ConcurrentCommonCacheTest.java |    7 +-
 .../runtime/memoize/StampedCommonCacheTest.java    |    7 +-
 .../memoize/UnlimitedConcurrentCacheTest.java      |    7 +-
 .../codehaus/groovy/tools/TestDgmConverter.java    |   12 +-
 .../codehaus/groovy/ant/CompileTaskSupport.java    |    7 +-
 .../groovy/ant/FileSystemCompilerFacade.java       |    2 +-
 .../main/java/org/codehaus/groovy/ant/Groovy.java  |    7 +-
 .../main/java/org/codehaus/groovy/ant/Groovyc.java |   27 +-
 .../java/org/codehaus/groovy/ant/Groovydoc.java    |   30 +-
 .../codehaus/groovy/bsf/CachingGroovyEngine.java   |   14 +-
 .../groovy-bsf/src/spec/test/BSFSpecTest.java      |    2 +-
 .../test/java/org/codehaus/groovy/bsf/BSFTest.java |    2 +-
 .../groovy/groovysh/util/PackageHelperImpl.groovy  |  119 ++-
 .../java/groovy/json/DefaultJsonGenerator.java     |    8 +-
 .../groovy/json/internal/CharSequenceValue.java    |    3 +-
 .../apache/groovy/json/internal/NumberValue.java   |    3 +-
 .../groovy/nio/extensions/NioExtensions.java       |    4 +-
 .../spec/test/MarkupTemplateEngineSpecTest.groovy  |    7 +-
 .../groovy/text/MarkupTemplateEngineTest.groovy    |  701 +++++++-------
 .../src/main/java/groovy/test/AllTestSuite.java    |    7 +-
 .../src/main/java/groovy/test/GroovyAssert.java    |    2 +-
 .../src/main/java/groovy/test/GroovyTestCase.java  |    4 +-
 .../src/main/java/groovy/test/GroovyTestSuite.java |    7 +-
 .../NotYetImplementedASTTransformation.java        |   64 +-
 .../NotYetImplementedTransformTest.groovy          |  210 ++--
 .../apache/groovy/parser/antlr4/AstBuilder.java    |   23 +-
 .../groovy/parser/antlr4/ModifierManager.java      |    1 -
 .../groovy/parser/antlr4}/ModifierNode.java        |    6 +-
 .../groovy/parser/antlr4/SemanticPredicates.java   |    1 -
 .../test/resources/core/EnumDeclaration_02.groovy  |   27 +-
 167 files changed, 3654 insertions(+), 2802 deletions(-)
 delete mode 100644 src/test/groovy/bugs/Groovy8223.groovy
 delete mode 100644 src/test/groovy/bugs/Groovy9292.groovy
 create mode 100644 src/test/groovy/bugs/Groovy9292Bug.groovy
 delete mode 100644 src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300.groovy
 copy src/test/org/codehaus/groovy/classgen/asm/sc/bugs/{Groovy7316Bug.groovy => Groovy7300Bug.groovy} (60%)
 rename subprojects/parser-antlr4/src/main/java/org/{codehaus/groovy/ast => apache/groovy/parser/antlr4}/ModifierNode.java (96%)


[groovy] 01/01: GROOVY-7996: check for get(String)/set(String, Object) or propertyMissing

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY-7996
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 3a9b12ad1f3f2307936eb2b3a014a9195d655ff8
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Oct 29 14:37:21 2019 -0500

    GROOVY-7996: check for get(String)/set(String,Object) or propertyMissing
---
 .../transform/stc/StaticTypeCheckingVisitor.java      | 19 +++++++++++++++++++
 src/test/groovy/bugs/Groovy7996.groovy                | 14 +++++++++-----
 .../src/spec/test/MarkupTemplateEngineSpecTest.groovy |  7 ++++---
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index f38d0d7..3e562e2 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1716,6 +1716,25 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                     }
                 }
             }
+
+            // GROOVY-7996: check if receiver implements get(String)/set(String,Object) or propertyMissing(String)
+            if (!testClass.isArray() && !isPrimitiveType(getUnwrapper(testClass))
+                    && objectExpression instanceof VariableExpression && typeCheckingContext.getEnclosingClosure() != null) {
+                MethodNode mopMethod;
+                if (readMode) {
+                    mopMethod = testClass.getMethod("get", new Parameter[]{new Parameter(STRING_TYPE, "name")});
+                } else {
+                    mopMethod = testClass.getMethod("set", new Parameter[]{new Parameter(STRING_TYPE, "name"), new Parameter(OBJECT_TYPE, "value")});
+                }
+                if (mopMethod == null) mopMethod = testClass.getMethod("propertyMissing", new Parameter[]{new Parameter(STRING_TYPE, "propertyName")});
+
+                if (mopMethod != null) {
+                    pexp.putNodeMetaData(DYNAMIC_RESOLUTION, Boolean.TRUE);
+                    pexp.removeNodeMetaData(DECLARATION_INFERRED_TYPE);
+                    pexp.removeNodeMetaData(INFERRED_TYPE);
+                    return true;
+                }
+            }
         }
 
         for (Receiver<String> receiver : receivers) {
diff --git a/src/test/groovy/bugs/Groovy7996.groovy b/src/test/groovy/bugs/Groovy7996.groovy
index fc0872f..39de261 100644
--- a/src/test/groovy/bugs/Groovy7996.groovy
+++ b/src/test/groovy/bugs/Groovy7996.groovy
@@ -18,16 +18,18 @@
  */
 package groovy.bugs
 
-import groovy.test.NotYetImplemented
+import groovy.transform.CompileStatic
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
+import static groovy.test.GroovyAssert.shouldFail
 
+@CompileStatic
 final class Groovy7996 {
 
-    @Test @NotYetImplemented
+    @Test
     void testFieldAccessFromClosure1() {
-        assertScript '''
+        def err = shouldFail '''
             class Foo {
                 def build(@DelegatesTo(value=Foo, strategy=Closure.DELEGATE_FIRST) Closure block) {
                     this.with(block)
@@ -45,13 +47,15 @@ final class Groovy7996 {
                 boolean doStuff() {
                     Foo foo = new Foo()
                     foo.build {
-                        bar.isEmpty() // "ClassCastException: java.lang.String cannot be cast to java.util.List"
+                        bar.isEmpty() // ClassCastException: java.lang.String cannot be cast to java.util.List
                     }
                 }
             }
 
-            assert new Bar().doStuff()
+            new Bar().doStuff()
         '''
+
+        assert err =~ /Cannot find matching method java.lang.Object#isEmpty\(\)/
     }
 
     @Test
diff --git a/subprojects/groovy-templates/src/spec/test/MarkupTemplateEngineSpecTest.groovy b/subprojects/groovy-templates/src/spec/test/MarkupTemplateEngineSpecTest.groovy
index c94f449..da68093 100644
--- a/subprojects/groovy-templates/src/spec/test/MarkupTemplateEngineSpecTest.groovy
+++ b/subprojects/groovy-templates/src/spec/test/MarkupTemplateEngineSpecTest.groovy
@@ -22,7 +22,8 @@ import groovy.text.Template
 import groovy.text.markup.MarkupTemplateEngine
 import groovy.text.markup.TemplateConfiguration
 
-class MarkupTemplateEngineSpecTest extends GroovyTestCase {
+final class MarkupTemplateEngineSpecTest extends GroovyTestCase {
+
     private MarkupTemplateEngine engine
     private TemplateConfiguration config
     private Map model
@@ -621,7 +622,7 @@ pages.each { page ->                    // <1>
         // end::typechecked_setup_fixed[]
          */
 
-        assertError 'No such property: text for class: MarkupTemplateEngineSpecTest$Page'
+        assertError 'No such property: text for class: MarkupTemplateEngineSpec'
     }
 
     void testInlinedTypeCheckedModel() {
@@ -654,7 +655,7 @@ pages.each { page ->
 // end::typechecked_inlined_template_expected[]
 '''
 
-        assertError 'No such property: text for class: MarkupTemplateEngineSpecTest$Page'
+        assertError 'No such property: text for class: MarkupTemplateEngineSpec'
     }
 
     void testFragment() {