private IExternalResourceProvider <ILanguageRuntime> GetProvider()
        {
            if (provider != null)
            {
                return(provider);
            }

            var cilLanguageName = (CilGrammarSource)this.languageName;

            if (Attributes.Exists <DerivedAssemblyMarker>(cilLanguageName.SourceAssembly))
            {
                provider = new CompiledLanguageProvider(
                    cilLanguageName,
                    new RequiredAssemblyProvider(cilLanguageName.SourceAssembly.GetName()));

                return(provider);
            }

            provider = new CompiledLanguageProvider(
                cilLanguageName,
                new DerivedAssemblyProvider(cilLanguageName.SourceAssembly, null, null));

            if (!ResourceContext.Instance.CanLoadOrBuild(provider))
            {
                provider = new ResourceGetter <ILanguageRuntime>(
                    (ILogging logging, out ILanguageRuntime output) =>
                {
                    ILanguageRuntime l;
                    if (!bootstrapLanguages.TryGetValue(cilLanguageName, out l))
                    {
                        LanguageData data;

                        if (!ResourceContext.Instance.LoadOrBuild(
                                new LanguageDataProvider(cilLanguageName, true),
                                out data))
                        {
                            output = null;
                            return(false);
                        }

                        l = new BootstrapLanguage(cilLanguageName, data);
                        bootstrapLanguages[cilLanguageName] = l;
                    }

                    output = l;
                    return(true);
                });
            }

            return(provider);
        }
Esempio n. 2
0
        public bool LoadOrBuild <T>(IExternalResourceProvider <T> resource, out T output) where T : class
        {
            bool result = LoadOrBuild((IExternalResource)resource);

            if (result)
            {
                output = resource.Resource;
            }
            else
            {
                output = null;
            }

            return(result);
        }
Esempio n. 3
0
 public DelegateProvider(IExternalResourceProvider <Assembly> assemblyProvider, string typeName, string methodName)
 {
     this.assemblyProvider = assemblyProvider;
     this.typeName         = typeName;
     this.methodName       = methodName;
 }
 public CompiledLanguageProvider(CilGrammarSource languageName, IExternalResourceProvider <Assembly> assemblyProvider)
 {
     this.languageName     = languageName;
     this.assemblyProvider = assemblyProvider;
 }