All pastes #395961 Raw Edit

Stuff

public text v1 · immutable
·published 2007-03-15 12:40 UTC
rendered paste body
using System;
using System.Collections;
using System.Xml;

namespace ABG.API.Core
{
	public class Class: TypeBase
	{
		// contained elements
		internal ArrayList classList = new ArrayList();
		internal ArrayList constructorList = new ArrayList();
		internal ArrayList converterList = new ArrayList();
		internal ArrayList enumerationList = new ArrayList();
		internal ArrayList fieldList = new ArrayList();
		internal ArrayList methodList = new ArrayList();
		internal ArrayList operatorMethodList = new ArrayList();
		internal ArrayList structList = new ArrayList();
		internal ArrayList typedefList = new ArrayList();
		internal ArrayList unionList = new ArrayList();
		internal ArrayList variableList = new ArrayList();

		// Can have at most one Destructor
		internal Destructor destructor = null;

		// List of base-class elements
		internal ArrayList baseClassList = new ArrayList();


		public Class(XmlTextReader rd): base(rd)
		{
			// Base types are indicated in two way: as attributes in
			// the class element, and as child elements of the class
			// element. Only the latter indicates whether inheritance
			// is public, private, or protected. Given how rare non-public
			// inheritance is, we can just use the attribute version for
			// now.
		}


		// Polish() required because items contained in the class may
		// not have their declarations loaded when Class is instantiated.
		protected internal override void Polish(IDictionary table)
		{
			base.Polish(table);

			foreach (string s in StringListToArray(attributes["bases"]))
				baseClassList.Add(table[s]);

			foreach (string s in StringListToArray(attributes["members"]))
			{
				object o = table[s];

				if (o == null)
				{
					Log.LogEvent(LogLevel.Detailed, "Class {0} declares member {1}, which is not available.", this.Name, s);
					continue;
				}

				Declaration decl = (Declaration) o;

				switch (decl.DeclarationKind)
				{
					case DeclarationKind.Method:
						methodList.Add(decl);
						break;
					case DeclarationKind.Constructor:
						constructorList.Add(decl);
						break;
					case DeclarationKind.Converter:
						converterList.Add(decl);
						break;
					case DeclarationKind.OperatorMethod:
						operatorMethodList.Add(decl);
						break;
					case DeclarationKind.Enumeration:
						enumerationList.Add(decl);
						break;
					case DeclarationKind.Field:
						fieldList.Add(decl);
						break;
					case DeclarationKind.Class:
						classList.Add(decl);
						break;
					case DeclarationKind.Struct:
						structList.Add(decl);
						break;
					case DeclarationKind.Typedef:
						typedefList.Add(decl);
						break;
					case DeclarationKind.Union:
						unionList.Add(decl);
						break;
					case DeclarationKind.Variable:
						variableList.Add(decl);
						break;
					case DeclarationKind.Destructor:
						destructor = (Destructor) decl;
						break;
					default:
						Log.LogEvent(LogLevel.Detailed, "Class {0} declares member {1}, with unhandled DeclarationKind {2}",
								this.Name, decl.Name, decl.DeclarationKind);
						break;
				}
			} // foreach
		} // Polish



		public IList Classes
		{
			get { return classList; }
		}


		public IList Constructors
		{
			get { return constructorList; }
		}


		public IList Converters
		{
			get { return converterList; }
		}

		public IList Enumerations
		{
			get { return enumerationList; }
		}

		public IList Fields
		{
			get { return fieldList; }
		}


		public IList Methods
		{
			get { return methodList; }
		}


		public IList OperatorMethods
		{
			get { return operatorMethodList; }
		}


		public IList Structs
		{
			get { return structList; }
		}

		public IList Typedefs
		{
			get { return typedefList; }
		}

		public IList Unions
		{
			get { return unionList; }
		}


		// Note: These are actually static fields.
		public IList Variables
		{
			get { return variableList; }
		}


		public Destructor Destructor
		{
			get { return destructor; }
		}


		public IList BaseClasses
		{
			get { return baseClassList; }
		}


		public override DeclarationKind DeclarationKind
		{
			get { return DeclarationKind.Class; }
		}
	}
} // namespace