private bool CanReferenceModule()

in Backend/Core/ForTea.Core/Psi/T4ModuleReferencer.cs [24:67]


    private bool CanReferenceModule([CanBeNull] IPsiModule module, [CanBeNull] IPsiModule moduleToReference)
      => module is T4FilePsiModule t4PsiModule
         && t4PsiModule.IsValid()
         && moduleToReference != null
         && moduleToReference.ContainingProjectModule is IAssembly assembly
         && _environment.TargetFrameworkId.IsReferenceAllowed(assembly.TargetFrameworkId);

    public bool CanReferenceModule(IPsiModule module, IPsiModule moduleToReference, UserDataHolder userDataHolder)
      => CanReferenceModule(module, moduleToReference);

    public bool ReferenceModule(IPsiModule module, IPsiModule moduleToReference)
      => ReferenceModuleImpl(module, moduleToReference, null);

    public bool ReferenceModuleWithType(IPsiModule module, ITypeElement typeToReference)
      => ReferenceModuleImpl(module, typeToReference.Module, typeToReference.GetContainingNamespace().QualifiedName);

    private bool ReferenceModuleImpl([NotNull] IPsiModule module, [NotNull] IPsiModule moduleToReference,
      [CanBeNull] string ns)
    {
      if (!CanReferenceModule(module, moduleToReference))
        return false;

      var t4PsiModule = (IT4FilePsiModule)module;
      var assembly = (IAssembly)moduleToReference.ContainingProjectModule;
      Assertion.AssertNotNull(assembly, "assembly != null");

      if (!(t4PsiModule.SourceFile.GetTheOnlyPsiFile(T4Language.Instance) is IT4File t4File))
        return false;

      Action action = () =>
      {
        // add assembly directive
        t4File.AddDirective(T4DirectiveInfoManager.Assembly.CreateDirective(assembly.FullAssemblyName));

        // add import directive if necessary
        if (!String.IsNullOrEmpty(ns)
            && !t4File.GetDirectives(T4DirectiveInfoManager.Import).Any(d => String.Equals(ns,
              d.GetAttributeValueByName(T4DirectiveInfoManager.Import.NamespaceAttribute.Name),
              StringComparison.Ordinal)))
          t4File.AddDirective(T4DirectiveInfoManager.Import.CreateDirective(ns));
      };

      return ExecuteTransaction(module, action);
    }