From c539ec18741e313f7af5568d02c52b8652b70a43 Mon Sep 17 00:00:00 2001 From: Tom Bentley Date: Wed, 24 Sep 2014 11:10:18 +0100 Subject: [PATCH] Fix #1818 by substituting a temporary variable and assigning the field to it after successful completion of the loop, as we do for non-shared attributes. --- .../ceylon/compiler/java/codegen/ClassTransformer.java | 9 +++++++++ .../compiler/java/codegen/StatementTransformer.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler-java/src/com/redhat/ceylon/compiler/java/codegen/ClassTransformer.java b/compiler-java/src/com/redhat/ceylon/compiler/java/codegen/ClassTransformer.java index d809953545c..59d33063a33 100755 --- a/compiler-java/src/com/redhat/ceylon/compiler/java/codegen/ClassTransformer.java +++ b/compiler-java/src/com/redhat/ceylon/compiler/java/codegen/ClassTransformer.java @@ -1826,6 +1826,15 @@ public void transform(AttributeDeclaration decl, ClassDefinitionBuilder classBui classBuilder.field(modifiers, attrName, type, initialValue, !useField, makeAtIgnore()); } } + + // A shared attribute might be initialized in a for statement, so + // we might need a def-assignment subst for it + List annots = makeJavaTypeAnnotations(decl.getDeclarationModel()); + JCStatement outerSubs = statementGen().openOuterSubstitutionIfNeeded( + decl.getDeclarationModel(), model.getType(), annots, 0); + if (outerSubs != null) { + classBuilder.init(outerSubs); + } } boolean withinInterface = Decl.withinInterface(decl); diff --git a/compiler-java/src/com/redhat/ceylon/compiler/java/codegen/StatementTransformer.java b/compiler-java/src/com/redhat/ceylon/compiler/java/codegen/StatementTransformer.java index 21726023fa8..9be64bdfaa8 100755 --- a/compiler-java/src/com/redhat/ceylon/compiler/java/codegen/StatementTransformer.java +++ b/compiler-java/src/com/redhat/ceylon/compiler/java/codegen/StatementTransformer.java @@ -2734,7 +2734,7 @@ public List transform(Tree.AttributeDeclaration decl) { return result.toList(); } - private JCStatement openOuterSubstitutionIfNeeded( + JCStatement openOuterSubstitutionIfNeeded( Value value, ProducedType t, List annots, int modifiers) { JCStatement result = null;