private string GetProfileLabel() { var label = ""; var fragment = Fragment; switch (FragmentType) { case FragmentType.Profile: label = "Profile"; break; case FragmentType.Null: break; case FragmentType.Text: label = "Text"; break; case FragmentType.Placeholder: label = Identifier(((Placeholder)fragment).Class, ((Placeholder)fragment).Property); break; case FragmentType.Body: break; case FragmentType.Segment: label = ((Segment)fragment).Class; break; case FragmentType.Annotation: label = "Annotation"; break; case FragmentType.Block: label = "Block"; break; case FragmentType.Lookup: label = (((Lookup)fragment).SecondaryBody().FragmentList.Count > 0 ? "~" : "") + Identifier(((Lookup)fragment).Class1, ((Lookup)fragment).Property1) + "=" + Identifier(((Lookup)fragment).Class2, ((Lookup)fragment).Property2); break; case FragmentType.Condition: { var condition = (Condition)fragment; GenComparison comparison; Contract.Assert(Enum.TryParse(condition.Comparison, out comparison), "Invalid comparison: " + condition.Comparison); var s = new StringBuilder(Identifier(condition.Class1, condition.Property1)); var x = ProfileFragmentSyntaxDictionary.ActiveProfileFragmentSyntaxDictionary.GenComparisonText[ (int)comparison]; s.Append(x); if (comparison != GenComparison.Exists && comparison != GenComparison.NotExists) { s.Append(condition.UseLit != "" ? GenUtilities.StringOrName(condition.Lit) : Identifier(condition.Class2, condition.Property2)); } label = s.ToString(); break; } case FragmentType.Function: label = ((Function)fragment).FunctionName; break; case FragmentType.TextBlock: label = "Text"; break; default: throw new ArgumentOutOfRangeException(); } return(label); }
private void OutputFragment(Fragment fragment, TextPosition bodyPosition) { var fragmentType = fragment.FragmentType; var fragmentPosition = new ProfileTextPosition(new TextPosition(), new TextPosition(), new TextPosition(), fragment); switch (fragmentType) { case FragmentType.Null: break; case FragmentType.Text: OutputText(((Text)fragment).TextValue, fragmentPosition.Position); break; case FragmentType.Placeholder: var placeholderFragment = (Placeholder)fragment; OutputText("`" + Identifier(placeholderFragment.Class, placeholderFragment.Property) + "`", fragmentPosition.Position); break; case FragmentType.Segment: var segmentFragment = (Segment)fragment; var cardinality = segmentFragment.GenCardinality; var separated = cardinality == GenCardinality.AllDlm || cardinality == GenCardinality.BackDlm; OutputText("`[" + segmentFragment.Class + Dictionary.GenCardinalityText[(int)cardinality] + ":", fragmentPosition.Position); OutputBody(segmentFragment.Body(), fragmentPosition.BodyPosition); if (separated) { OutputText("`;", fragmentPosition.Position); OutputBody(segmentFragment.SecondaryBody(), fragmentPosition.SecondaryBodyPosition); } OutputText("`]", fragmentPosition.Position); break; case FragmentType.Profile: OutputBody(((Profile.Profile)fragment).Body(), bodyPosition); break; case FragmentType.Block: var blockFragment = (Block)fragment; OutputText("`{", fragmentPosition.Position); OutputBody(blockFragment.Body(), fragmentPosition.BodyPosition); OutputText("`]", fragmentPosition.Position); break; case FragmentType.Lookup: var lookupFragment = (Lookup)fragment; var noMatch = lookupFragment.SecondaryBody().FragmentList.Count > 0; OutputText( "`%" + Identifier(lookupFragment.Class1, lookupFragment.Property1) + "=" + Identifier(lookupFragment.Class2, lookupFragment.Property2) + ":", fragmentPosition.Position); OutputBody(lookupFragment.Body(), fragmentPosition.BodyPosition); if (noMatch) { OutputText("`;", fragmentPosition.Position); OutputBody(lookupFragment.SecondaryBody(), fragmentPosition.SecondaryBodyPosition); } OutputText("`]", fragmentPosition.Position); break; case FragmentType.Condition: var conditionFragment = (Condition)fragment; var comparison = conditionFragment.GenComparison; var elsePart = conditionFragment.Secondary != "Empty1"; OutputText( "`?" + Identifier(conditionFragment.Class1, conditionFragment.Property1) + Dictionary.GenComparisonText[(int)comparison] + ((comparison == GenComparison.Exists || comparison == GenComparison.NotExists) ? "" : (conditionFragment.UseLit != "" ? GenUtilities.StringOrName(conditionFragment.Lit) : conditionFragment.Class2 + "." + conditionFragment.Property2)) + ":", fragmentPosition.Position); OutputBody(conditionFragment.Body(), fragmentPosition.BodyPosition); if (elsePart) { OutputText("`;", fragmentPosition.Position); OutputBody(conditionFragment.SecondaryBody(), fragmentPosition.SecondaryBodyPosition); } OutputText("`]", fragmentPosition.Position); break; case FragmentType.Function: var functionFragment = (Function)fragment; var body = functionFragment.Body().FragmentList; var param = new string[body.Count]; for (var i = 0; i < body.Count; i++) { param[i] = GetText(body[i], bodyPosition); } var separator = Dictionary.FunctionParameterSeparator; var p = string.Join(separator, param); OutputText("`@" + functionFragment.FunctionName + ":", fragmentPosition.Position); OutputText(p, fragmentPosition.Position); OutputText("`]", fragmentPosition.Position); break; case FragmentType.TextBlock: var textBlockFragment = (TextBlock)fragment; OutputBody(textBlockFragment.Body(), fragmentPosition.BodyPosition); OutputText("", fragmentPosition.Position); // Necessary to set fragment length break; case FragmentType.Annotation: var annotationFragment = (Annotation)fragment; OutputText("`-", fragmentPosition.Position); OutputBody(annotationFragment.Body(), fragmentPosition.BodyPosition); OutputText("`]", fragmentPosition.Position); break; default: throw new ArgumentOutOfRangeException(); } bodyPosition.Length += fragmentPosition.Position.Length; ProfileTextPostionList.Add(fragmentPosition); }