コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }