protected Divert DivertIdentifierWithArguments() { Whitespace (); List<string> targetComponents = Parse (DotSeparatedDivertPathComponents); if (targetComponents == null) return null; Whitespace (); var optionalArguments = Parse(ExpressionFunctionCallArguments); Whitespace (); var targetPath = new Path (targetComponents); return new Divert (targetPath, optionalArguments); }
public override void ResolveReferences (Story context) { base.ResolveReferences (context); // Work is already done if it's a constant reference if (isConstantReference) { return; } // Is it a read count? var parsedPath = new Path (path); Parsed.Object targetForCount = parsedPath.ResolveFromContext (this); if (targetForCount) { targetForCount.containerForCounting.visitsShouldBeCounted = true; _runtimeVarRef.pathForCount = targetForCount.runtimePath; _runtimeVarRef.name = null; // Check for very specific writer error: getting read count and // printing it as content rather than as a piece of logic // e.g. Writing {myFunc} instead of {myFunc()} var targetFlow = targetForCount as FlowBase; if (targetFlow && targetFlow.isFunction) { // Is parent context content rather than logic? if ( parent is Weave || parent is ContentList || parent is FlowBase) { Warning ("'" + targetFlow.name + "' being used as read count rather than being called as function. Perhaps you intended to write " + targetFlow.name + "()"); } } return; } // Definitely a read count, but wasn't found? else if (path.Count > 1) { Error ("Could not find target for read count: " + parsedPath); return; } if (!context.ResolveVariableWithName (this.name, fromNode: this).found) { Error("Unresolved variable: "+this.ToString(), this); } }
public override void ResolveReferences (Story context) { if (_finalLooseEndTarget) { var flowEndPath = _finalLooseEndTarget.path; foreach (var finalLooseEndDivert in _finalLooseEnds) { finalLooseEndDivert.targetPath = flowEndPath; } } if (_startingSubFlowDivert) { _startingSubFlowDivert.targetPath = _startingSubFlowRuntime.path; } base.ResolveReferences(context); // Check validity of parameter names if (arguments != null) { foreach (var arg in arguments) { // Don't allow reserved words for argument names if (VariableAssignment.IsReservedKeyword (arg.name)) { Error ("Argument '" + arg.name + "' is a reserved word, please choose another name"); continue; } // Does argument conflict with a knot/stitch/label? var pathOfTheoreticalTarget = new Path (arg.name); Parsed.Object target = pathOfTheoreticalTarget.ResolveFromContext (this); if (target) { Error ("Argument '" + arg.name + "' conflicts with a " + target.GetType().Name + " on " + target.debugMetadata + ", "); continue; } // Does argument conflict with another variable name? if (context.ResolveVariableWithName (arg.name, fromNode: this.parent).found) { Error("Argument '"+ arg.name + "' conflicts with existing variable definition at higher scope."); continue; } } } }