private string GetSerializedATN(ITypeMirror recognizerClass)
        {
            IList <IElement> elements = processingEnv.GetElementUtils().GetAllMembers((ITypeElement
                                                                                       )processingEnv.GetTypeUtils().AsElement(recognizerClass));

            foreach (IElement element in elements)
            {
                if (element.GetKind() != ElementKind.Field)
                {
                    continue;
                }
                IVariableElement field         = (IVariableElement)element;
                bool             isStatic      = element.GetModifiers().Contains(Modifier.Static);
                object           constantValue = field.GetConstantValue();
                bool             isString      = constantValue is string;
                string           name          = field.GetSimpleName().ToString();
                if (isStatic && isString && name.Equals("_serializedATN"))
                {
                    return((string)constantValue);
                }
            }
            processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, "Could not retrieve serialized ATN from grammar."
                                                     );
            return(null);
        }
示例#2
0
        private int[] GetRuleVersions(ITypeMirror recognizerClass, string[] ruleNames)
        {
            int[]            versions = new int[ruleNames.Length];
            IList <IElement> elements = processingEnv.GetElementUtils().GetAllMembers((ITypeElement)processingEnv.GetTypeUtils().AsElement(recognizerClass));

            foreach (IElement element in elements)
            {
                if (element.GetKind() != ElementKind.Field)
                {
                    continue;
                }
                IVariableElement field         = (IVariableElement)element;
                bool             isStatic      = element.GetModifiers().Contains(Modifier.Static);
                object           constantValue = field.GetConstantValue();
                bool             isInteger     = constantValue is int;
                string           name          = field.GetSimpleName().ToString();
                if (isStatic && isInteger && name.StartsWith("RULE_"))
                {
                    try
                    {
                        name = Sharpen.Runtime.Substring(name, "RULE_".Length);
                        if (name.IsEmpty() || !System.Char.IsLower(name[0]))
                        {
                            continue;
                        }
                        int index = (int)constantValue;
                        if (index < 0 || index >= versions.Length)
                        {
                            string message = string.Format("Rule index {0} for rule '{1}' out of bounds for recognizer {2}.", index, name, recognizerClass.ToString());
                            processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, element);
                            continue;
                        }
                        if (name.IndexOf(ATNSimulator.RuleVariantDelimiter) >= 0)
                        {
                            // ignore left-factored pseudo-rules
                            continue;
                        }
                        IExecutableElement ruleMethod = GetRuleMethod(recognizerClass, name);
                        if (ruleMethod == null)
                        {
                            string message = string.Format("Could not find rule method for rule '{0}' in recognizer {1}.", name, recognizerClass.ToString());
                            processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, element);
                            continue;
                        }
                        RuleVersion ruleVersion = ruleMethod.GetAnnotation <RuleVersion>();
                        int         version     = ruleVersion != null?ruleVersion.Value() : 0;

                        versions[index] = version;
                    }
                    catch (ArgumentException)
                    {
                        processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, "Exception occurred while validating rule dependencies.", element);
                    }
                }
            }
            return(versions);
        }
        private string[] GetRuleNames(ITypeMirror recognizerClass)
        {
            IList <string>   result   = new List <string>();
            IList <IElement> elements = processingEnv.GetElementUtils().GetAllMembers((ITypeElement
                                                                                       )processingEnv.GetTypeUtils().AsElement(recognizerClass));

            foreach (IElement element in elements)
            {
                if (element.GetKind() != ElementKind.Field)
                {
                    continue;
                }
                IVariableElement field         = (IVariableElement)element;
                bool             isStatic      = element.GetModifiers().Contains(Modifier.Static);
                object           constantValue = field.GetConstantValue();
                bool             isInteger     = constantValue is int;
                string           name          = field.GetSimpleName().ToString();
                if (isStatic && isInteger && name.StartsWith("RULE_"))
                {
                    try
                    {
                        name = Sharpen.Runtime.Substring(name, "RULE_".Length);
                        if (name.IsEmpty() || !System.Char.IsLower(name[0]))
                        {
                            continue;
                        }
                        int index = (int)constantValue;
                        if (index < 0)
                        {
                            continue;
                        }
                        while (result.Count <= index)
                        {
                            result.AddItem(string.Empty);
                        }
                        result.Set(index, name);
                    }
                    catch (ArgumentException)
                    {
                        processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, "Exception occurred while validating rule dependencies."
                                                                 , element);
                    }
                }
            }
            return(Sharpen.Collections.ToArray(result, new string[result.Count]));
        }