public TemplateDirectiveInfo([NotNull] T4Environment environment)
            : base("template")
        {
            bool isAtLeastVs11 = environment.VsVersion2.Major >= 11;

            _languageAttribute = new EnumDirectiveAttributeInfo("language", DirectiveAttributeOptions.None, "C#", "VB");
            _hostSpecificAttribute = isAtLeastVs11
                ? new EnumDirectiveAttributeInfo("hostspecific",DirectiveAttributeOptions.None, "true", "false", "trueFromBase")
                : new BooleanDirectiveAttributeInfo("hostspecific", DirectiveAttributeOptions.None);
            _debugAttribute = new BooleanDirectiveAttributeInfo("debug", DirectiveAttributeOptions.None);
            _inheritsAttribute = new DirectiveAttributeInfo("inherits", DirectiveAttributeOptions.None);
            _cultureAttribute = new CultureDirectiveAttributeInfo("culture", DirectiveAttributeOptions.None);
            _compilerOptionsAttribute = new DirectiveAttributeInfo("compilerOptions", DirectiveAttributeOptions.None);
            _linePragmasAttribute = new BooleanDirectiveAttributeInfo("linePragmas", DirectiveAttributeOptions.None);
            _visibilityAttribute = new EnumDirectiveAttributeInfo("visibility", DirectiveAttributeOptions.None, "public", "internal");

            var attributes = new List<DirectiveAttributeInfo>(8) {
                _languageAttribute,
                _hostSpecificAttribute,
                _debugAttribute,
                _inheritsAttribute,
                _cultureAttribute,
                _compilerOptionsAttribute
            };

            if (isAtLeastVs11) {
                attributes.Add(_linePragmasAttribute);
                attributes.Add(_visibilityAttribute);
            }

            _supportedAttributes = attributes.AsReadOnly();
        }
        public IncludeDirectiveInfo()
            : base("include")
        {
            _fileAttribute = new DirectiveAttributeInfo("file", DirectiveAttributeOptions.Required | DirectiveAttributeOptions.DisplayInCodeStructure);

            _supportedAttributes = Array.AsReadOnly(new[] {
                _fileAttribute
            });
        }
        public ImportDirectiveInfo()
            : base("import")
        {
            _namespaceAttribute = new DirectiveAttributeInfo("namespace", DirectiveAttributeOptions.Required | DirectiveAttributeOptions.DisplayInCodeStructure);

            _supportedAttributes = Array.AsReadOnly(new[] {
                _namespaceAttribute
            });
        }
		public AssemblyDirectiveInfo()
			: base("assembly") {

			_nameAttribute = new DirectiveAttributeInfo("name", DirectiveAttributeOptions.Required | DirectiveAttributeOptions.DisplayInCodeStructure);

			_supportedAttributes = Array.AsReadOnly(new[] {
				_nameAttribute
			});
		}
		public IncludeDirectiveInfo([NotNull] T4Environment environment)
			: base("include") {

			_fileAttribute = new DirectiveAttributeInfo("file", DirectiveAttributeOptions.Required | DirectiveAttributeOptions.DisplayInCodeStructure);
			_onceAttribute = new BooleanDirectiveAttributeInfo("once", DirectiveAttributeOptions.None);

			_supportedAttributes = Array.AsReadOnly(environment.VsVersion2.Major >= 12
				? new[] { _fileAttribute, _onceAttribute }
				: new[] { _fileAttribute });
		}
		public OutputDirectiveInfo()
			: base("output") {

			_extensionAttribute = new DirectiveAttributeInfo("extension", DirectiveAttributeOptions.None);
			_encodingAttribute = new EncodingDirectiveAttributeInfo("encoding", DirectiveAttributeOptions.None);

			_supportedAttributes = Array.AsReadOnly(new[] {
				_extensionAttribute,
				_encodingAttribute
			});
		}
        public ParameterDirectiveInfo()
            : base("parameter")
        {
            _typeAttribute = new DirectiveAttributeInfo("type", DirectiveAttributeOptions.Required);
            _nameAttribute = new DirectiveAttributeInfo("name", DirectiveAttributeOptions.Required | DirectiveAttributeOptions.DisplayInCodeStructure);

            _supportedAttributes = Array.AsReadOnly(new[] {
                _typeAttribute,
                _nameAttribute
            });
        }