Explorar o código

2003-04-24 Gonzalo Paniagua Javier <[email protected]>

	* Microsoft.CSharp/CSharpCodeGenerator.cs: implemented
	GenerateSnippetMember and some little fixes.

	* System.CodeDom/CodeMemberProperty.cs: fixed HasGet and HasSet to
	actually generate code for the property.

	* System.CodeDom.Compiler/CodeGenerator.cs: more fixes and sorted the
	output.

	* System.CodeDom.Compiler/IndentedTextWriter.cs: don't output tabs in
	WriteLine ().

svn path=/trunk/mcs/; revision=13960
Gonzalo Paniagua Javier %!s(int64=23) %!d(string=hai) anos
pai
achega
fd6f5a46b5

+ 5 - 7
mcs/class/System/Microsoft.CSharp/CSharpCodeGenerator.cs

@@ -293,7 +293,7 @@ namespace Mono.CSharp
 
 			GenerateExpression( statement.Expression );
 
-			output.Write( ";" );
+			output.WriteLine ( ";" );
 		}
 
 		protected override void GenerateConditionStatement( CodeConditionStatement statement )
@@ -463,7 +463,7 @@ namespace Mono.CSharp
 		
 		protected override void GenerateSnippetMember( CodeSnippetTypeMember member )
 		{
-			Output.Write( "<GenerateSnippetMember>" );
+			Output.Write (member.Text);
 		}
 		
 		protected override void GenerateEntryPointMethod( CodeEntryPointMethod method, 
@@ -522,7 +522,7 @@ namespace Mono.CSharp
 
 			MemberAttributes attributes = property.Attributes;
 			OutputMemberAccessModifier( attributes );
-			OutputFieldScopeModifier( attributes );
+			OutputMemberScopeModifier( attributes );
 
 			OutputTypeNamePair( property.Type, property.Name );
 			output.WriteLine (" {");
@@ -534,10 +534,9 @@ namespace Mono.CSharp
 				++Indent;
 
 				GenerateStatements (property.GetStatements);
-				output.WriteLine ();
 
-				output.WriteLine ("}");
 				--Indent;
+				output.WriteLine ("}");
 			}
 			
 			if (property.HasSet)
@@ -546,10 +545,9 @@ namespace Mono.CSharp
 				++Indent;
 
 				GenerateStatements (property.SetStatements);
-				output.WriteLine ();
 
-				output.WriteLine ("}");
 				--Indent;
+				output.WriteLine ("}");
 			}
 
 			--Indent;

+ 5 - 0
mcs/class/System/Microsoft.CSharp/ChangeLog

@@ -1,3 +1,8 @@
+2003-04-24  Gonzalo Paniagua Javier <[email protected]>
+
+	* CSharpCodeGenerator.cs: implemented GenerateSnippetMember and some
+	little fixes.
+
 2003-04-23  Gonzalo Paniagua Javier <[email protected]>
 
 	* CSharpCodeGenerator.cs: beautified conditional statements. Implemented

+ 6 - 0
mcs/class/System/System.CodeDom.Compiler/ChangeLog

@@ -1,3 +1,9 @@
+2003-04-24  Gonzalo Paniagua Javier <[email protected]>
+
+	* CodeGenerator.cs: more fixes and sorted the output.
+	
+	* IndentedTextWriter.cs: don't output tabs in WriteLine ().
+
 2003-04-23  Gonzalo Paniagua Javier <[email protected]>
 
 	* CodeGenerator.cs:

+ 118 - 62
mcs/class/System/System.CodeDom.Compiler/CodeGenerator.cs

@@ -4,8 +4,9 @@
 // Author:
 //   Miguel de Icaza ([email protected])
 //   Daniel Stodden ([email protected])
+//   Gonzalo Paniagua Javier ([email protected])
 //
-// (C) 2001 Ximian, Inc.
+// (C) 2001-2003 Ximian, Inc.
 //
 
 using System.CodeDom;
@@ -124,6 +125,7 @@ namespace System.CodeDom.Compiler {
 		//
 		protected virtual void ContinueOnNewLine( string st )
 		{
+			output.WriteLine (st);
 		}
 
 		/*
@@ -140,63 +142,13 @@ namespace System.CodeDom.Compiler {
 
 		protected virtual void GenerateBinaryOperatorExpression (CodeBinaryOperatorExpression e)
 		{
-			GenerateExpression( e.Left );
-			
-			switch ( e.Operator ) {
-			case CodeBinaryOperatorType.Add:
-				output.Write( " + " );
-				break;
-			case CodeBinaryOperatorType.Assign:
-				output.Write( " = " );
-				break;
-			case CodeBinaryOperatorType.BitwiseAnd:
-				output.Write( " & " );
-				break;
-			case CodeBinaryOperatorType.BitwiseOr:
-				output.Write( " | " );
-				break;
-			case CodeBinaryOperatorType.BooleanAnd:
-				output.Write( " && " );
-				break;
-			case CodeBinaryOperatorType.BooleanOr:
-				output.Write( " || " );
-				break;
-			case CodeBinaryOperatorType.Divide:
-				output.Write( " / " );
-				break;
-			case CodeBinaryOperatorType.GreaterThan:
-				output.Write( " > " );
-				break;
-			case CodeBinaryOperatorType.GreaterThanOrEqual:
-				output.Write( " >= " );
-				break;
-			case CodeBinaryOperatorType.IdentityEquality:
-				output.Write( " == " );
-				break;
-			case CodeBinaryOperatorType.IdentityInequality:
-				output.Write( " != " );
-				break;
-			case CodeBinaryOperatorType.LessThan:
-				output.Write( " < " );
-				break;
-			case CodeBinaryOperatorType.LessThanOrEqual:
-				output.Write( " <= " );
-				break;
-			case CodeBinaryOperatorType.Modulus:
-				output.Write( " % " );
-				break;
-			case CodeBinaryOperatorType.Multiply:
-				output.Write( " * " );
-				break;
-			case CodeBinaryOperatorType.Subtract:
-				output.Write( " - " );
-				break;
-			case CodeBinaryOperatorType.ValueEquality:
-				output.Write( " == " );
-				break;
-			}
-
-			GenerateExpression( e.Right );
+			output.Write ('(');
+			GenerateExpression (e.Left);
+			output.Write (' ');
+			OutputOperator (e.Operator);
+			output.Write (' ');
+			GenerateExpression (e.Right);
+			output.Write (')');
 		}
 
 		protected abstract void GenerateCastExpression (CodeCastExpression e);
@@ -418,7 +370,8 @@ namespace System.CodeDom.Compiler {
 
 		protected virtual void GenerateParameterDeclarationExpression (CodeParameterDeclarationExpression e)
 		{
-			OutputAttributeDeclarations( e.CustomAttributes );
+			if (e.CustomAttributes != null && e.CustomAttributes.Count > 0)
+				OutputAttributeDeclarations( e.CustomAttributes );
 			OutputDirection( e.Direction );
 			OutputType( e.Type );
 			output.Write( ' ' );
@@ -613,7 +566,7 @@ namespace System.CodeDom.Compiler {
 		{
 			switch ( direction ) {
 			case FieldDirection.In:
-				output.Write( "in " );
+				//output.Write( "in " );
 				break;
 			case FieldDirection.Out:
 				output.Write( "out " );
@@ -669,6 +622,7 @@ namespace System.CodeDom.Compiler {
 
 		protected virtual void OutputIdentifier( string ident )
 		{
+			output.Write (ident);
 		}
 
 		protected virtual void OutputMemberAccessModifier( MemberAttributes attributes )
@@ -705,7 +659,7 @@ namespace System.CodeDom.Compiler {
 				output.Write( "abstract " );
 				break;
 			case MemberAttributes.Final:
-				output.Write( "sealed " );
+				// Do nothing
 				break;
 			case MemberAttributes.Static:
 				output.Write( "static " );
@@ -734,10 +688,71 @@ namespace System.CodeDom.Compiler {
 				
 		protected virtual void OutputOperator( CodeBinaryOperatorType op )
 		{
+			switch (op) {
+			case CodeBinaryOperatorType.Add:
+				output.Write ("+");
+				break;
+			case CodeBinaryOperatorType.Subtract:
+				output.Write ("-");
+				break;
+			case CodeBinaryOperatorType.Multiply:
+				output.Write ("*");
+				break;
+			case CodeBinaryOperatorType.Divide:
+				output.Write ("/");
+				break;
+			case CodeBinaryOperatorType.Modulus:
+				output.Write ("%");
+				break;
+			case CodeBinaryOperatorType.Assign:
+				output.Write ("=");
+				break;
+			case CodeBinaryOperatorType.IdentityInequality:
+				output.Write ("!=");
+				break;
+			case CodeBinaryOperatorType.IdentityEquality:
+				output.Write ("==");
+				break;
+			case CodeBinaryOperatorType.ValueEquality:
+				output.Write ("==");
+				break;
+			case CodeBinaryOperatorType.BitwiseOr:
+				output.Write ("|");
+				break;
+			case CodeBinaryOperatorType.BitwiseAnd:
+				output.Write ("&");
+				break;
+			case CodeBinaryOperatorType.BooleanOr:
+				output.Write ("||");
+				break;
+			case CodeBinaryOperatorType.BooleanAnd:
+				output.Write ("&&");
+				break;
+			case CodeBinaryOperatorType.LessThan:
+				output.Write ("<");
+				break;
+			case CodeBinaryOperatorType.LessThanOrEqual:
+				output.Write ("<=");
+				break;
+			case CodeBinaryOperatorType.GreaterThan:
+				output.Write (">");
+				break;
+			case CodeBinaryOperatorType.GreaterThanOrEqual:
+				output.Write (">=");
+				break;
+			}
 		}
 
 		protected virtual void OutputParameters( CodeParameterDeclarationExpressionCollection parameters )
 		{
+			bool first = true;
+			foreach (CodeParameterDeclarationExpression expr in parameters) {
+				GenerateExpression (expr);
+				if (first)
+					first = false;
+				else
+					output.Write (", ");
+			}
 		}
 
 		protected abstract void OutputType( CodeTypeReference t );
@@ -863,7 +878,14 @@ namespace System.CodeDom.Compiler {
 
 			GenerateTypeStart( type );
 
-			foreach ( CodeTypeMember member in type.Members ) {
+			CodeTypeMember [] members = new CodeTypeMember [type.Members.Count];
+			type.Members.CopyTo (members, 0);
+			Array.Sort (members, CodeTypeMemberComparer.Default);
+			
+			// WARNING: if anything is missing in the foreach loop and you add it, add the type in
+			// its corresponding place in CodeTypeMemberComparer class (below)
+
+			foreach ( CodeTypeMember member in members ) {
 
 				CodeTypeMember prevMember = this.currentMember;
 				this.currentMember = member;
@@ -955,5 +977,39 @@ namespace System.CodeDom.Compiler {
 		{
 			ValidateIdentifier( value );
 		}
+
+
+		class CodeTypeMemberComparer : IComparer
+		{
+			private CodeTypeMemberComparer () {}
+
+			static CodeTypeMemberComparer instance = new CodeTypeMemberComparer ();
+			
+			// The position in the array determines the order in which those
+			// kind of CodeTypeMembers are generated. Less is more ;-)
+			static Type [] memberTypes = {  typeof (CodeMemberField),
+							typeof (CodeSnippetTypeMember),
+							typeof (CodeTypeConstructor),
+							typeof (CodeConstructor),
+							typeof (CodeMemberProperty),
+							typeof (CodeMemberEvent),
+							typeof (CodeMemberMethod),
+							typeof (CodeTypeDeclaration),
+							typeof (CodeEntryPointMethod)
+						};
+
+			public IComparer Default {
+				get { return instance; }
+			}
+			
+			int IComparer.Compare (object x, object y)
+			{
+				int xindex = Array.IndexOf (memberTypes, x.GetType ());
+				int yindex = Array.IndexOf (memberTypes, y.GetType ());
+
+				return xindex - yindex;
+			}
+		}
+		
 	}
 }

+ 0 - 1
mcs/class/System/System.CodeDom.Compiler/IndentedTextWriter.cs

@@ -170,7 +170,6 @@ namespace System.CodeDom.Compiler {
 		
 		public override void WriteLine()
 		{
-			OutputTabs();
 			writer.WriteLine();
 			newline = true;
 		}

+ 5 - 0
mcs/class/System/System.CodeDom/ChangeLog

@@ -1,3 +1,8 @@
+2003-04-24  Gonzalo Paniagua Javier <[email protected]>
+
+	* CodeMemberProperty.cs: fixed HasGet and HasSet to actually generate
+	code for the property.
+	
 2002-10-11  Ravi Pratap  <[email protected]>
 
 	* CodeMethodInvokeExpression.cs : Fix second constructor so that

+ 7 - 2
mcs/class/System/System.CodeDom/CodeMemberProperty.cs

@@ -47,19 +47,24 @@ namespace System.CodeDom
 
 		public bool HasGet {
 			get {
-				return hasGet;
+				return (hasGet || (getStatements != null && getStatements.Count > 0));
 			}
 			set {
 				hasGet = value;
+				if (!hasGet && getStatements != null)
+					getStatements.Clear ();
+					
 			}
 		}
 		
 		public bool HasSet {
 			get {
-				return hasSet;
+				return (hasSet || (setStatements != null && setStatements.Count > 0));
 			}
 			set {
 				hasSet = value;
+				if (!hasSet && setStatements != null)
+					setStatements.Clear ();
 			}
 		}