// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using Microsoft.AspNetCore.Razor.Language.Intermediate;

namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
	public abstract class IntermediateNodeWriter
	{
		public abstract void WriteUsingDirective( CodeRenderingContext context, UsingDirectiveIntermediateNode node );

		public abstract void WriteCSharpExpression( CodeRenderingContext context, CSharpExpressionIntermediateNode node );

		public abstract void WriteCSharpCode( CodeRenderingContext context, CSharpCodeIntermediateNode node );

		public abstract void WriteHtmlContent( CodeRenderingContext context, HtmlContentIntermediateNode node );

		public abstract void WriteHtmlAttribute( CodeRenderingContext context, HtmlAttributeIntermediateNode node );

		public abstract void WriteHtmlAttributeValue( CodeRenderingContext context, HtmlAttributeValueIntermediateNode node );

		public abstract void WriteCSharpExpressionAttributeValue( CodeRenderingContext context, CSharpExpressionAttributeValueIntermediateNode node );

		public abstract void WriteCSharpCodeAttributeValue( CodeRenderingContext context, CSharpCodeAttributeValueIntermediateNode node );

		public virtual void WriteComponent( CodeRenderingContext context, ComponentIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public virtual void WriteComponentAttribute( CodeRenderingContext context, ComponentAttributeIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public virtual void WriteComponentChildContent( CodeRenderingContext context, ComponentChildContentIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public virtual void WriteComponentTypeArgument( CodeRenderingContext context, ComponentTypeArgumentIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public virtual void WriteComponentTypeInferenceMethod( CodeRenderingContext context, ComponentTypeInferenceMethodIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public virtual void WriteMarkupElement( CodeRenderingContext context, MarkupElementIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public virtual void WriteMarkupBlock( CodeRenderingContext context, MarkupBlockIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public virtual void WriteSetKey( CodeRenderingContext context, SetKeyIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public virtual void WriteSplat( CodeRenderingContext context, SplatIntermediateNode node )
		{
			throw new NotSupportedException( "This writer does not support components." );
		}

		public abstract void BeginWriterScope( CodeRenderingContext context, string writer );

		public abstract void EndWriterScope( CodeRenderingContext context );
	}
}
