protected override IExpression ProjectAsNonConstantIExpression() { if (this.cachedProjection == null) { object member = this.ResolveAsValueContainer(true); INestedTypeDefinition groupType = member as INestedTypeDefinition; if (groupType != null) { // expression refers to a group Cast cast = new Cast(new Parenthesis(this.Instance, this.SourceLocation), TypeExpression.For(this.Type), this.SourceLocation); cast.SetContainingExpression(this); // TODO the projection of cast looses its source location, it only retains the source location of the casted expression, // so we stick the proper location on the casted expression itself return this.cachedProjection = cast.ProjectAsIExpression(); } IFieldDefinition fieldDef = member as IFieldDefinition; if (fieldDef != null) { var addrOf = new VccAddressOf(new AddressableExpression(new ProjectionHelper(this.Qualifier, this.SimpleName, fieldDef, this.SourceLocation)), this.SourceLocation); addrOf.SetContainingExpression(this); return this.cachedProjection = addrOf.ProjectAsIExpression(); } this.cachedProjection = new DummyExpression(this.SourceLocation); } return this.cachedProjection; }