/// <summary> /// Gets additional flags of the caller routine. /// </summary> public static RoutineFlags InvocationFlags(this IPhpRoutineSymbol routine) { RoutineFlags f = RoutineFlags.None; var ps = routine.Parameters; foreach (var p in ps) { if (p.IsImplicitlyDeclared) { if (SpecialParameterSymbol.IsQueryValueParameter(p, out var ctor, out var container)) { switch (container) { case SpecialParameterSymbol.QueryValueTypes.CallerArgs: f |= RoutineFlags.UsesArgs; break; case SpecialParameterSymbol.QueryValueTypes.LocalVariables: f |= RoutineFlags.UsesLocals; break; } } else if (SpecialParameterSymbol.IsCallerStaticClassParameter(p)) { f |= RoutineFlags.UsesLateStatic; } }
protected virtual IEnumerable <ParameterSymbol> CreateParameters(IEnumerable <ParameterSymbol> baseparams) { int index = 0; // Context <ctx> yield return(new SpecialParameterSymbol(this, DeclaringCompilation.CoreTypes.Context, SpecialParameterSymbol.ContextName, index++)); if (IsInitFieldsOnly) { // QueryValue<DummyFieldsOnlyCtor> _ var dummy = DeclaringCompilation.CoreTypes.QueryValue_T.Symbol.Construct(DeclaringCompilation.CoreTypes.QueryValue_DummyFieldsOnlyCtor); yield return(new SpecialParameterSymbol(this, dummy, "_", index++)); } // same parameters as PHP constructor foreach (var p in baseparams) { if (SpecialParameterSymbol.IsContextParameter(p)) { continue; } if (SpecialParameterSymbol.IsQueryValueParameter(p, out var _, out var t) && t == SpecialParameterSymbol.QueryValueTypes.DummyFieldsOnlyCtor) { continue; } yield return(new SynthesizedParameterSymbol(this, p.Type, index++, p.RefKind, p.Name, p.IsParams, explicitDefaultConstantValue: p.ExplicitDefaultConstantValue)); } }