B.TypeMemberModifiers ConvertModifier(AttributedNode node, B.TypeMemberModifiers defaultVisibility)
		{
			Modifiers m = node.Modifier;
			B.TypeMemberModifiers r = B.TypeMemberModifiers.None;
			if ((m & Modifiers.Private) != 0)
				r |= B.TypeMemberModifiers.Private;
			if ((m & Modifiers.Internal) != 0)
				r |= B.TypeMemberModifiers.Internal;
			if ((m & Modifiers.Public) != 0)
				r |= B.TypeMemberModifiers.Public;
			if ((m & Modifiers.Protected) != 0)
				r |= B.TypeMemberModifiers.Protected;
			if (r == B.TypeMemberModifiers.None)
				r = defaultVisibility;
			
			if ((m & Modifiers.Abstract) != 0)
				r |= B.TypeMemberModifiers.Abstract;
			if ((m & Modifiers.Virtual) != 0)
				r |= B.TypeMemberModifiers.Virtual;
			if ((m & Modifiers.Sealed) != 0)
				r |= B.TypeMemberModifiers.Final;
			if ((m & Modifiers.Static) != 0) {
				r |= B.TypeMemberModifiers.Static;
			} else if (currentType != null && currentType.IsStatic) {
				if (!(node is TypeDeclaration))
					r |= B.TypeMemberModifiers.Static;
			}
			if ((m & Modifiers.Override) != 0)
				r |= B.TypeMemberModifiers.Override;
			if ((m & Modifiers.ReadOnly) != 0 && !(node is PropertyDeclaration)) {
				r |= B.TypeMemberModifiers.Final;
			}
			if ((m & Modifiers.Const) != 0) {
				r |= B.TypeMemberModifiers.Final | B.TypeMemberModifiers.Static;
			}
			if ((m & Modifiers.New) != 0) {
				AddError(node, "shadowing is not supported");
			}
			if ((m & Modifiers.Partial) != 0) {
				r |= B.TypeMemberModifiers.Partial;
			}
			if ((m & Modifiers.Extern) != 0) {
				// not necessary in Boo
			}
			if ((m & Modifiers.Volatile) != 0) {
				AddError(node, "Volatile modifier is not supported");
			}
			if ((m & Modifiers.Unsafe) != 0) {
				AddError(node, "Unsafe modifier is not supported");
			}
			if ((m & Modifiers.Overloads) != 0) {
				// not necessary in Boo
			}
			if ((m & Modifiers.WithEvents) != 0) {
				// not necessary in Boo
			}
			return r;
		}
		void AddWarning(B.LexicalInfo lex, string warningMessage)
		{
			warnings.Add(new CompilerWarning(lex, warningMessage));
		}
		void AddError(B.LexicalInfo lex, string errorMessage)
		{
			errors.Add(new CompilerError(lex, errorMessage));
		}
		B.TypeReference ConvertTypeReference(B.Expression expr)
		{
			B.TypeofExpression te = expr as B.TypeofExpression;
			if (te != null)
				return te.Type;
			if (expr is B.ReferenceExpression) {
				return new B.SimpleTypeReference(expr.ToCodeString());
			}
			AddError(expr.LexicalInfo, "Expected type, but found expression.");
			return null;
		}
		void ConvertTypeReferences(List<TypeReference> input, B.TypeReferenceCollection output)
		{
			foreach (TypeReference t in input) {
				B.TypeReference r = ConvertTypeReference(t);
				if (r != null) {
					output.Add(r);
				}
			}
		}
		B.TypeMemberModifiers ConvertModifier(AttributedNode node, B.TypeMemberModifiers defaultVisibility)
		{
			Modifiers m = node.Modifier;
			B.TypeMemberModifiers r = B.TypeMemberModifiers.None;
			if ((m & Modifiers.Private) != 0)
				r |= B.TypeMemberModifiers.Private;
			if ((m & Modifiers.Internal) != 0)
				r |= B.TypeMemberModifiers.Internal;
			if ((m & Modifiers.Public) != 0)
				r |= B.TypeMemberModifiers.Public;
			if ((m & Modifiers.Protected) != 0)
				r |= B.TypeMemberModifiers.Protected;
			if (r == B.TypeMemberModifiers.None)
				r = defaultVisibility;
			
			if ((m & Modifiers.Abstract) != 0)
				r |= B.TypeMemberModifiers.Abstract;
			if ((m & Modifiers.Virtual) != 0)
				r |= B.TypeMemberModifiers.Virtual;
			if ((m & Modifiers.Sealed) != 0)
				r |= B.TypeMemberModifiers.Final;
			if ((m & Modifiers.Static) != 0) {
				r |= B.TypeMemberModifiers.Static;
			} else if (currentType != null && currentType.IsStatic) {
				if (!(node is TypeDeclaration))
					r |= B.TypeMemberModifiers.Static;
			}
			if ((m & Modifiers.Override) != 0)
				r |= B.TypeMemberModifiers.Override;
			if ((m & Modifiers.ReadOnly) != 0 && !(node is PropertyDeclaration)) {
				r |= B.TypeMemberModifiers.Final;
			}
			if ((m & Modifiers.Const) != 0) {
				r |= B.TypeMemberModifiers.Final | B.TypeMemberModifiers.Static;
			}
			if ((m & Modifiers.New) != 0) {
				AddError(node, "shadowing is not supported");
			}
			if ((m & Modifiers.Partial) != 0) {
				r |= B.TypeMemberModifiers.Partial;
			}
			if ((m & Modifiers.Extern) != 0) {
				// not necessary in Boo
			}
			if ((m & Modifiers.Volatile) != 0) {
				AddError(node, "Volatile modifier is not supported");
			}
			if ((m & Modifiers.Unsafe) != 0) {
				AddError(node, "Unsafe modifier is not supported");
			}
			if ((m & Modifiers.Overloads) != 0) {
				// not necessary in Boo
			}
			if ((m & Modifiers.WithEvents) != 0) {
				// not necessary in Boo
			}
			if ((m & Modifiers.Default) != 0) {
				ParametrizedNode parametrizedNode = node as ParametrizedNode;
				string name = null;
				if (parametrizedNode != null) {
					name = parametrizedNode.Name;
				} else {
					AddError(node, "Default modifier is not supported on this member.");
				}
				if (name != null && currentType != null) {
					currentType.Attributes.Add(MakeAttribute("System.Reflection.DefaultMember", new B.StringLiteralExpression(name)));
				}
			}
			return r;
		}