[nemerle] r8410 committed - Refactoring

1 view
Skip to first unread message

codesite...@google.com

unread,
Oct 27, 2009, 7:04:57 PM10/27/09
to nemer...@googlegroups.com
Revision: 8410
Author: v...@rsdn.ru
Date: Tue Oct 27 16:04:20 2009
Log: Refactoring
http://code.google.com/p/nemerle/source/detail?r=8410

Modified:

/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.Designer.cs

/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.cs

/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.resx

/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/LanguageService/NemerleSource.cs

=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.Designer.cs
Mon Oct 26 02:38:15 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.Designer.cs
Tue Oct 27 16:04:20 2009
@@ -28,150 +28,150 @@
/// </summary>
private void InitializeComponent()
{
- this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new
System.ComponentModel.ComponentResourceManager(typeof(ImplementMembersForm));
- this.pbImplement = new System.Windows.Forms.Button();
- this.pbCancel = new System.Windows.Forms.Button();
- this._grid = new System.Windows.Forms.DataGridView();
- this.ItfMemberNameCol = new
System.Windows.Forms.DataGridViewTextBoxColumn();
- this.AddImplCol = new System.Windows.Forms.DataGridViewCheckBoxColumn();
- this.Explicit = new System.Windows.Forms.DataGridViewCheckBoxColumn();
- this.AccessMods = new System.Windows.Forms.DataGridViewComboBoxColumn();
- this.ImplName = new System.Windows.Forms.DataGridViewTextBoxColumn();
- this.Signature = new System.Windows.Forms.DataGridViewTextBoxColumn();
- this.panel1 = new System.Windows.Forms.Panel();
- this.imageList1 = new System.Windows.Forms.ImageList(this.components);
- ((System.ComponentModel.ISupportInitialize)(this._grid)).BeginInit();
- this.panel1.SuspendLayout();
- this.SuspendLayout();
- //
- // pbImplement
- //
- this.pbImplement.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom
| System.Windows.Forms.AnchorStyles.Right)));
- this.pbImplement.Location = new System.Drawing.Point(443, 7);
- this.pbImplement.Name = "pbImplement";
- this.pbImplement.Size = new System.Drawing.Size(91, 23);
- this.pbImplement.TabIndex = 0;
- this.pbImplement.Text = "&Implement";
- this.pbImplement.UseVisualStyleBackColor = true;
- this.pbImplement.Click += new
System.EventHandler(this.pbImplement_Click);
- //
- // pbCancel
- //
- this.pbCancel.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom
| System.Windows.Forms.AnchorStyles.Right)));
- this.pbCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.pbCancel.Location = new System.Drawing.Point(540, 7);
- this.pbCancel.Name = "pbCancel";
- this.pbCancel.Size = new System.Drawing.Size(75, 23);
- this.pbCancel.TabIndex = 1;
- this.pbCancel.Text = "&Cancel";
- this.pbCancel.UseVisualStyleBackColor = true;
- //
- // _grid
- //
- this._grid.AllowUserToAddRows = false;
- this._grid.AllowUserToDeleteRows = false;
- this._grid.ColumnHeadersHeightSizeMode =
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
- this._grid.Columns.AddRange(new
System.Windows.Forms.DataGridViewColumn[] {
- this.ItfMemberNameCol,
- this.AddImplCol,
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new
System.ComponentModel.ComponentResourceManager(typeof(ImplementMembersForm));
+ this.pbImplement = new System.Windows.Forms.Button();
+ this.pbCancel = new System.Windows.Forms.Button();
+ this._grid = new System.Windows.Forms.DataGridView();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.imageList1 = new
System.Windows.Forms.ImageList(this.components);
+ this.SoutceName = new
System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.Implement = new
System.Windows.Forms.DataGridViewCheckBoxColumn();
+ this.Explicit = new
System.Windows.Forms.DataGridViewCheckBoxColumn();
+ this.AccessModifier = new
System.Windows.Forms.DataGridViewComboBoxColumn();
+ this.ImplementationName = new
System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.Signature = new
System.Windows.Forms.DataGridViewTextBoxColumn();
+ ((System.ComponentModel.ISupportInitialize)(this._grid)).BeginInit();
+ this.panel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // pbImplement
+ //
+ this.pbImplement.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom
| System.Windows.Forms.AnchorStyles.Right)));
+ this.pbImplement.Location = new System.Drawing.Point(443, 7);
+ this.pbImplement.Name = "pbImplement";
+ this.pbImplement.Size = new System.Drawing.Size(91, 23);
+ this.pbImplement.TabIndex = 0;
+ this.pbImplement.Text = "&Implement";
+ this.pbImplement.UseVisualStyleBackColor = true;
+ this.pbImplement.Click += new
System.EventHandler(this.pbImplement_Click);
+ //
+ // pbCancel
+ //
+ this.pbCancel.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom
| System.Windows.Forms.AnchorStyles.Right)));
+ this.pbCancel.DialogResult =
System.Windows.Forms.DialogResult.Cancel;
+ this.pbCancel.Location = new System.Drawing.Point(540, 7);
+ this.pbCancel.Name = "pbCancel";
+ this.pbCancel.Size = new System.Drawing.Size(75, 23);
+ this.pbCancel.TabIndex = 1;
+ this.pbCancel.Text = "&Cancel";
+ this.pbCancel.UseVisualStyleBackColor = true;
+ //
+ // _grid
+ //
+ this._grid.AllowUserToAddRows = false;
+ this._grid.AllowUserToDeleteRows = false;
+ this._grid.ColumnHeadersHeightSizeMode =
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this._grid.Columns.AddRange(new
System.Windows.Forms.DataGridViewColumn[] {
+ this.SoutceName,
+ this.Implement,
this.Explicit,
- this.AccessMods,
- this.ImplName,
+ this.AccessModifier,
+ this.ImplementationName,
this.Signature});
- this._grid.Dock = System.Windows.Forms.DockStyle.Fill;
- this._grid.Location = new System.Drawing.Point(0, 0);
- this._grid.Name = "_grid";
- this._grid.Size = new System.Drawing.Size(620, 362);
- this._grid.TabIndex = 6;
- //
- // ItfMemberNameCol
- //
- this.ItfMemberNameCol.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
- this.ItfMemberNameCol.Frozen = true;
- this.ItfMemberNameCol.HeaderText = "Soutce name";
- this.ItfMemberNameCol.MinimumWidth = 20;
- this.ItfMemberNameCol.Name = "ItfMemberNameCol";
- this.ItfMemberNameCol.ReadOnly = true;
- this.ItfMemberNameCol.SortMode =
System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
- this.ItfMemberNameCol.Width = 250;
- //
- // AddImplCol
- //
- this.AddImplCol.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader;
- this.AddImplCol.Frozen = true;
- this.AddImplCol.HeaderText = "Implement";
- this.AddImplCol.Name = "AddImplCol";
- this.AddImplCol.Width = 72;
- //
- // Explicit
- //
- this.Explicit.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader;
- this.Explicit.HeaderText = "Explicit";
- this.Explicit.Name = "Explicit";
- this.Explicit.Width = 52;
- //
- // AccessMods
- //
- this.AccessMods.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
- this.AccessMods.DisplayStyle =
System.Windows.Forms.DataGridViewComboBoxDisplayStyle.Nothing;
- this.AccessMods.HeaderText = "Access modifier";
- this.AccessMods.Name = "AccessMods";
- this.AccessMods.Width = 89;
- //
- // ImplName
- //
- this.ImplName.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
- this.ImplName.HeaderText = "Implementation name";
- this.ImplName.Name = "ImplName";
- this.ImplName.SortMode =
System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
- this.ImplName.Width = 121;
- //
- // Signature
- //
- this.Signature.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
- this.Signature.HeaderText = "Signature";
- this.Signature.Name = "Signature";
- this.Signature.ReadOnly = true;
- this.Signature.SortMode =
System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
- this.Signature.Width = 66;
- //
- // panel1
- //
- this.panel1.Controls.Add(this.pbCancel);
- this.panel1.Controls.Add(this.pbImplement);
- this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
- this.panel1.Location = new System.Drawing.Point(0, 362);
- this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(620, 38);
- this.panel1.TabIndex = 7;
- //
- // imageList1
- //
- this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth24Bit;
- this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
- this.imageList1.TransparentColor = System.Drawing.Color.Magenta;
- //
- // ImplementMembersForm
- //
- this.AcceptButton = this.pbImplement;
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.pbCancel;
- this.ClientSize =
global::Nemerle.VisualStudio.Properties.Settings.Default.ImplementMembersSize;
- this.Controls.Add(this._grid);
- this.Controls.Add(this.panel1);
- this.DataBindings.Add(new System.Windows.Forms.Binding("ClientSize",
global::Nemerle.VisualStudio.Properties.Settings.Default, "ImplementMembersSize",
true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MinimizeBox = false;
- this.Name = "ImplementMembersForm";
- this.ShowInTaskbar = false;
- this.StartPosition =
System.Windows.Forms.FormStartPosition.CenterParent;
- this.Text = "Implement unimplemented members of implemented interfaces";
- this.Load += new System.EventHandler(this.ImplementMembersForm_Load);
- ((System.ComponentModel.ISupportInitialize)(this._grid)).EndInit();
- this.panel1.ResumeLayout(false);
- this.ResumeLayout(false);
+ this._grid.Dock = System.Windows.Forms.DockStyle.Fill;
+ this._grid.Location = new System.Drawing.Point(0, 0);
+ this._grid.Name = "_grid";
+ this._grid.Size = new System.Drawing.Size(620, 362);
+ this._grid.TabIndex = 6;
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.pbCancel);
+ this.panel1.Controls.Add(this.pbImplement);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panel1.Location = new System.Drawing.Point(0, 362);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(620, 38);
+ this.panel1.TabIndex = 7;
+ //
+ // imageList1
+ //
+ this.imageList1.ColorDepth =
System.Windows.Forms.ColorDepth.Depth24Bit;
+ this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
+ this.imageList1.TransparentColor = System.Drawing.Color.Magenta;
+ //
+ // SoutceName
+ //
+ this.SoutceName.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
+ this.SoutceName.Frozen = true;
+ this.SoutceName.HeaderText = "Soutce name";
+ this.SoutceName.MinimumWidth = 20;
+ this.SoutceName.Name = "SoutceName";
+ this.SoutceName.ReadOnly = true;
+ this.SoutceName.SortMode =
System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.SoutceName.Width = 250;
+ //
+ // Implement
+ //
+ this.Implement.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader;
+ this.Implement.Frozen = true;
+ this.Implement.HeaderText = "Implement";
+ this.Implement.Name = "Implement";
+ this.Implement.Width = 61;
+ //
+ // Explicit
+ //
+ this.Explicit.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader;
+ this.Explicit.HeaderText = "Explicit";
+ this.Explicit.Name = "Explicit";
+ this.Explicit.Width = 46;
+ //
+ // AccessModifier
+ //
+ this.AccessModifier.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+ this.AccessModifier.DisplayStyle =
System.Windows.Forms.DataGridViewComboBoxDisplayStyle.Nothing;
+ this.AccessModifier.HeaderText = "Access modifier";
+ this.AccessModifier.Name = "AccessModifier";
+ this.AccessModifier.Width = 78;
+ //
+ // ImplementationName
+ //
+ this.ImplementationName.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+ this.ImplementationName.HeaderText = "Implementation name";
+ this.ImplementationName.Name = "ImplementationName";
+ this.ImplementationName.SortMode =
System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.ImplementationName.Width = 102;
+ //
+ // Signature
+ //
+ this.Signature.AutoSizeMode =
System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+ this.Signature.HeaderText = "Signature";
+ this.Signature.Name = "Signature";
+ this.Signature.ReadOnly = true;
+ this.Signature.SortMode =
System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.Signature.Width = 58;
+ //
+ // ImplementMembersForm
+ //
+ this.AcceptButton = this.pbImplement;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.pbCancel;
+ this.ClientSize =
global::Nemerle.VisualStudio.Properties.Settings.Default.ImplementMembersSize;
+ this.Controls.Add(this._grid);
+ this.Controls.Add(this.panel1);
+ this.DataBindings.Add(new System.Windows.Forms.Binding("ClientSize",
global::Nemerle.VisualStudio.Properties.Settings.Default, "ImplementMembersSize",
true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
+ this.Icon =
((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MinimizeBox = false;
+ this.Name = "ImplementMembersForm";
+ this.ShowInTaskbar = false;
+ this.StartPosition =
System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Implement unimplemented members of implemented
interfaces";
+ this.Load += new System.EventHandler(this.ImplementMembersForm_Load);
+ ((System.ComponentModel.ISupportInitialize)(this._grid)).EndInit();
+ this.panel1.ResumeLayout(false);
+ this.ResumeLayout(false);

}

@@ -182,11 +182,11 @@
private System.Windows.Forms.DataGridView _grid;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.ImageList imageList1;
- private System.Windows.Forms.DataGridViewTextBoxColumn
ItfMemberNameCol;
- private System.Windows.Forms.DataGridViewCheckBoxColumn AddImplCol;
+ private System.Windows.Forms.DataGridViewTextBoxColumn SoutceName;
+ private System.Windows.Forms.DataGridViewCheckBoxColumn Implement;
private System.Windows.Forms.DataGridViewCheckBoxColumn Explicit;
- private System.Windows.Forms.DataGridViewComboBoxColumn AccessMods;
- private System.Windows.Forms.DataGridViewTextBoxColumn ImplName;
+ private System.Windows.Forms.DataGridViewComboBoxColumn AccessModifier;
+ private System.Windows.Forms.DataGridViewTextBoxColumn
ImplementationName;
private System.Windows.Forms.DataGridViewTextBoxColumn Signature;

}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.cs
Mon Oct 26 02:38:15 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.cs
Tue Oct 27 16:04:20 2009
@@ -1,28 +1,44 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
+using Nemerle.Completion2;
using Nemerle.VisualStudio.LanguageService;
using Nemerle.Compiler;
using System.Diagnostics;
using NUtils = Nemerle.Compiler.Utils.Utils;
-using BFld = System.Reflection.BindingFlags;
using TypeMembers =
System.Collections.Generic.KeyValuePair<Nemerle.Compiler.MType.Class,
Nemerle.Compiler.IMember>;
using Microsoft.VisualStudio.Package;
-using Microsoft.VisualStudio.TextManager.Interop;

namespace Nemerle.VisualStudio.GUI
{
- public partial class ImplementMembersForm : Form
+ // ReSharper disable LocalizableElement
+ // ReSharper disable PossibleNullReferenceException
+ public partial class ImplementMembersForm : Form
{
readonly NemerleSource _source;
readonly TypeBuilder _ty;
readonly IEnumerable<IMember> _unimplementedMembers;
- int _imageSize;
+ readonly int _imageSize;
+
+ class MemberImplInfo
+ {
+ public readonly IMember Member;
+ public readonly bool Explicit;
+ public readonly string AccessModifier;
+ public readonly string ImplementationName;
+
+
+ public MemberImplInfo(IMember member, bool @explicit, string
accessModifier, string implementationName)
+ {
+ Member = member;
+ Explicit = @explicit;
+ AccessModifier = accessModifier;
+ ImplementationName = implementationName;
+ }
+ }

public ImplementMembersForm(NemerleSource source, TypeBuilder ty,
IEnumerable<IMember> unimplementedMembers)
{
@@ -32,46 +48,61 @@

InitializeComponent();

+ #region Init events hendlers
+
+ _grid.CellPainting += CellPainting;
+ _grid.CellValueChanged += CellValueChanged;
+ _grid.CellValidating += CellValidating;
+ _grid.CurrentCellDirtyStateChanged += CurrentCellDirtyStateChanged;
+
+ #endregion
+ #region Init ImageList
+
imageList1.Images.AddStrip(Resources.SO_TreeViewIcons);
_imageSize = imageList1.ImageSize.Width;
Debug.Assert(imageList1.ImageSize.Width ==
imageList1.ImageSize.Height);
+
+ #endregion

if (_unimplementedMembers == null)
return;

- //var _ty.GetDirectSuperTypes().GroupJoin(_unimplementedMembers, itf
=> itf.tycon, m => m.DeclaringType,
- // (t, ms) => new { Ty = t, Members = ms });
+ FillTable(MakeTypeMembersMap());
+ }
+
+ /// <summary>
+ /// Групирует члены по типам в которых они объявлены и возвращает
результат.
+ /// При этом типы являются подстановочными типами (а не просто
TypeInf), что позволяет
+ /// создать для них корректные реализации (с верными значениями
параметров типов).
+ /// </summary>
+ private Dictionary<MType.Class, IMember[]> MakeTypeMembersMap()
+ {
var implItfs = _ty.GetDirectSuperTypes().Where(t => t.IsInterface);
- var itfs = _unimplementedMembers.GroupBy(m => m.DeclaringType);
+ var itfs = _unimplementedMembers.GroupBy(m => m.DeclaringType);
var res = implItfs.Join(itfs, t => t.tycon, itf => itf.Key, (t, itf)
=> new { Group = itf, Ty = t });
+
var ht = new Dictionary<MType.Class, IMember[]>();
foreach (var item in res)
ht[item.Ty] = ReplaceGettersAndSettersByProperties(item.Group);

- var baseTypes = itfs.Where(g => !g.Key.IsInterface);
- var tbTy = ty.GetMemType();
-
- foreach (var baseType in baseTypes)
- ht[baseType.Key.GetMemType()] =
ReplaceGettersAndSettersByProperties(baseType);
-
- FillTable(ht);
- }
-
- void FillTable(Dictionary<MType.Class, IMember[]> itfs)
- {
- _grid.CellPainting += CellPainting;
- _grid.CellValueChanged += CellValueChanged;
- _grid.CellValidating += CellValidating;
- _grid.CurrentCellDirtyStateChanged += CurrentCellDirtyStateChanged;
-
- var accessModaCol =
(DataGridViewComboBoxColumn)_grid.Columns["AccessMods"];
- var explicitCol =
(DataGridViewCheckBoxColumn)_grid.Columns["Explicit"];
- var implName = (DataGridViewTextBoxColumn)
_grid.Columns["ImplName"];
+ var baseTypes = itfs.Where(g => !g.Key.IsInterface);
+
+ foreach (var baseType in baseTypes)
+ ht[baseType.Key.GetMemType()] =
ReplaceGettersAndSettersByProperties(baseType);
+
+ return ht;
+ }
+
+ void FillTable(Dictionary<MType.Class, IMember[]> typeMembersesMap)
+ {
+ var accessModaCol = AccessModifierColumn();
+ var explicitCol = ExplicitColumn();
+ var implName = ImplementationNameColumn();


accessModaCol.Items.AddRange("public", "private", "protected", "internal", "protected
internal");
- _grid.Rows.Add("All", true);
-
- var haveInterfaces = itfs.Any(x => x.Key.IsInterface);
+ //_grid.Rows.Add("All", true);
+
+ var haveInterfaces = HaveInterfaces(typeMembersesMap);

if (!haveInterfaces)
{
@@ -79,7 +110,7 @@
Text = "Override members of base types";
}

- foreach (var item in itfs)
+ foreach (var item in typeMembersesMap)
{
var isInterface = item.Key.IsInterface;
var sifix = isInterface ? " (interface)" : " (base type)";
@@ -90,21 +121,26 @@
foreach (var m in item.Value)
{
var name = m.Name;
- rowIndex = _grid.Rows.Add(m.Name, true, false, null, m.Name, m);
+ rowIndex = _grid.Rows.Add(name, true, false, null, name, m);
row = _grid.Rows[rowIndex];
var implementByDefault = isInterface || (m.Attributes &
NemerleAttributes.Abstract) != 0;
- row.Cells["AddImplCol"].Value = implementByDefault;
+ ImplementCell(row).Value = implementByDefault;
row.Cells[0].Style.Padding = new Padding(_imageSize * 2, 0, 0, 0);
+
var gray = Color.FromKnownColor(KnownColor.GrayText);
- var explicitCell =
(DataGridViewCheckBoxCell)row.Cells["Explicit"];
-
- row.Cells["AccessMods"].Style.ForeColor = gray;
- row.Cells["ImplName"].Style.ForeColor = gray;
- row.Cells["Signature"].Style.ForeColor = gray;
+
+ AccessModifierCell (row).Style.ForeColor = gray;
+ ImplementationNameCell(row).Style.ForeColor = gray;
+ SignatureCell (row).Style.ForeColor = gray;
row.Tag = new TypeMembers(item.Key, m);
}
}
- }
+ }
+
+ private static bool HaveInterfaces(Dictionary<MType.Class, IMember[]>
typeMembersesMap)
+ {
+ return typeMembersesMap.Any(x => x.Key.IsInterface);
+ }

private static IMember[]
ReplaceGettersAndSettersByProperties(IGrouping<TypeInfo, IMember> item)
{
@@ -120,9 +156,17 @@
_grid.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

+// ReSharper disable MemberCanBeMadeStatic.Local
void CellValidating(object sender, DataGridViewCellValidatingEventArgs
e)
{
}
+// ReSharper restore MemberCanBeMadeStatic.Local
+
+ bool IsExplisitImplColumn(int colIndex)
+ {
+ var name = _grid.Columns[colIndex].Name;
+ return name == "AccessModifier" || name == "ImplementationName";
+ }

void CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
@@ -131,27 +175,22 @@
if (row.Tag == null)
return;

- switch (_grid.Columns[e.ColumnIndex].Name)
- {
- case "AccessMods": case "ImplName":
- row.Cells["Explicit"].Value = true;
- break;
- default:
- break;
- }
-
- var isImpl = (bool)row.Cells["AddImplCol"].Value;
- var isExplicit = (bool)row.Cells["Explicit"].Value;
-
- row.Cells["Explicit"].Style.ForeColor =
Color.FromKnownColor(isImpl ? KnownColor.WindowText : KnownColor.GrayText);
+ if (IsExplisitImplColumn(e.ColumnIndex))
+ ExplicitCell(row).Value = true;
+
+ var isImpl = ImplementCellValue(row);
+ var isExplicit = ExplicitCellValue(row);
+
+ ExplicitCell(row).Style.ForeColor = Color.FromKnownColor(isImpl ?
KnownColor.WindowText : KnownColor.GrayText);

var color = Color.FromKnownColor(isImpl && isExplicit ?
KnownColor.WindowText : KnownColor.GrayText);
- row.Cells["AccessMods"].Style.ForeColor = color;
- row.Cells["ImplName"].Style.ForeColor = color;
- row.Cells["Signature"].Style.ForeColor = color;
+ AccessModifierCell(row).Style.ForeColor = color;
+ ImplementationNameCell(row).Style.ForeColor = color;
+ SignatureCell(row).Style.ForeColor = color;

_grid.Invalidate();
}
+

void CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
@@ -187,117 +226,139 @@

private void pbImplement_Click(object sender, EventArgs e)
{
- var newLine = Environment.NewLine;
-
- var res = _grid.Rows.Cast<DataGridViewRow>()
- .Where(r => r.Tag != null && (bool)r.Cells["AddImplCol"].Value)
- .GroupBy(r => ((TypeMembers)r.Tag).Key, r =>
- new
- {
- Type = ((TypeMembers)r.Tag).Key,
- Member = ((TypeMembers)r.Tag).Value,
- Explicit = (bool)r.Cells["Explicit"].Value,
- AccessMods = (string)r.Cells["AccessMods"].Value,
- ImplName = (string)r.Cells["ImplName"].Value
- });
+ InsertStabsIntoSource();
+ }
+
+ private void InsertStabsIntoSource()
+ {
+ var res = _grid.Rows.Cast<DataGridViewRow>()
+ .Where(r => r.Tag != null && (bool)ImplementCell(r).Value)
+ .GroupBy(r => ((TypeMembers)r.Tag).Key, r =>
+ new MemberImplInfo(
+ ((TypeMembers)r.Tag).Value,
+ ExplicitCellValue(r),
+ AccessModifierCellValue(r),
+ ImplementationNameCellValue(r)
+ ));

var stubs = res.ToArray();
- var laggSrv = _source.LanguageService;
- var pref = laggSrv.Preferences;
-
- _source.LockWrite();
- var sufix = stubs.Length > 1 ? "s" : "";
- var editArray = new EditArray(_source, null, true, "implement
interface" + sufix + " stub" + sufix);
- try
- {
-
- foreach (var stub in stubs)
- {
- var writer = new System.IO.StringWriter();
- var itfMems = stub.ToArray();
- var isInterface = stub.Key.IsInterface;
- var ty = _ty.GetMemType();
-
- foreach (var item2 in itfMems)
- {
- if (isInterface)
- NUtils.GenerateMemberImplementation(writer, _source.FileIndex,
- stub.Key, item2.Member, item2.Explicit, item2.AccessMods,
item2.ImplName);
- else
- {
- var am = (item2.Member.Attributes | NemerleAttributes.Override)
- & ~(NemerleAttributes.Abstract | NemerleAttributes.Virtual);
- var acessMods = am.ToString().ToLower().Replace(",", "");
-
- NUtils.GenerateMemberImplementation(writer, _source.FileIndex,
- ty, item2.Member, false, acessMods, "");
- }
-
- writer.WriteLine();
- }
-
- var sb = writer.GetStringBuilder();
- //sb.Length -= Environment.NewLine.Length;
- if (!pref.InsertTabs && pref.IndentSize == 1)
- sb.Replace("\t", pref.MakeIndentString());
-
- TextPoint pt = new TextPoint();
- string indent = null;
-
- var member = NUtils.GetLastImplementedMembersOfInterface(_ty,
stub.Key);
-
- if (member.IsSome)
- {
- // Используем meber.Value для получения места вставки
- var endLine = member.Value.Location.EndLine;
- var text = _source.GetLine(endLine);
- indent = text.GetLiadingSpaces();
- pt = new TextPoint(endLine + 1, 1);
- //TODO: Этот код рассчитывает на то, что за членом не идет
многострочного коментария
- // или другого члена. Надо бы сделать реализацию не закладывающуюся
на это.
- }
- else // Ни одного члена этого интерфейса не реализовано в классе...
- {
- // Оборачиваем реализуемые методы в #region
- sb.Insert(0, "#region " + stub.Key + " Members" + newLine +
newLine);
- sb.AppendLine("#endregion " + stub.Key + " Members" + newLine);
- // Вставляем описание интерфейса в конец класса
- var endLine = _ty.Location.EndLine;
- var text = _source.GetLine(endLine);
- indent = text.GetLiadingSpaces();
- pt = new TextPoint(endLine, 1);
- indent += pref.MakeIndentString();
- //TODO: Этот код рассчитывает на то, что конец типа распологается на
отдельной строке.
- // Надо бы сделать реализацию не закладывающуюся на это.
- }
-
- sb.Insert(0, indent);
- sb.Replace("\n", "\n" + indent);
- TrimEnd(sb);
-
- Location inertLoc = new Location(_source.FileIndex, pt, pt);
- TextSpan span = inertLoc.ToTextSpan();
-
- editArray.Add(new EditSpan(span, sb.ToString()));
- //_source.SetText(span, sb.ToString());
- }
-
- editArray.ApplyEdits();
- Close();
- }
- catch (Exception ex)
- {
- _source.ProjectInfo.ShowMessage("Error: " + ex.Message,
Nemerle.Completion2.MessageType.Error);
- }
- finally
- {
- editArray.Dispose();
- _source.UnlockWrite();
- }
-
-
//Debug.WriteLine(writer.GetStringBuilder().Replace("\t", " ").ToString());
+ var laggSrv = _source.LanguageService;
+ var pref = laggSrv.Preferences;
+ var sufix = stubs.Length > 1 ? "s" : "";
+ var editArray = new EditArray(_source, null, true, "implement
interface" + sufix + " stub" + sufix);
+
+ _source.LockWrite();
+ try
+ {
+ MakeChanges(stubs, pref, editArray);
+ editArray.ApplyEdits();
+ Close();
+ }
+ catch (Exception ex)
+ {
+ _source.ProjectInfo.ShowMessage("Error: " + ex.Message,
MessageType.Error);
+ }
+ finally
+ {
+ editArray.Dispose();
+ _source.UnlockWrite();
+ }
+ }
+
+// ReSharper disable ParameterTypeCanBeEnumerable.Local
+ private void MakeChanges(IGrouping<MType.Class, MemberImplInfo>[]
stubs, LanguagePreferences pref, EditArray editArray)
+// ReSharper restore ParameterTypeCanBeEnumerable.Local
+ {
+ var newLine = Environment.NewLine;
+
+ foreach (var stub in stubs)
+ {
+ var sb = MakeStubsForTypeMembers(stub);
+
+ //sb.Length -= Environment.NewLine.Length;
+ if (!pref.InsertTabs && pref.IndentSize == 1)
+ sb.Replace("\t", pref.MakeIndentString());
+
+ TextPoint pt;
+ string indent;
+
+ var lastImplementedMembers =
NUtils.GetLastImplementedMembersOfInterface(_ty, stub.Key);
+
+ #region Calc indent and insertion point
+
+ if (lastImplementedMembers.IsSome)
+ {
+ // Используем meber.Value для получения места вставки
+ var endLine = lastImplementedMembers.Value.Location.EndLine;
+ var text = _source.GetLine(endLine);
+ indent = text.GetLiadingSpaces();
+ pt = new TextPoint(endLine + 1, 1);
+ //TODO: Этот код рассчитывает на то, что за членом не идет
многострочного коментария
+ // или другого члена. Надо бы сделать реализацию не
закладывающуюся на это.
+ }
+ else // Ни одного члена этого интерфейса не реализовано в классе...
+ {
+ // Оборачиваем реализуемые методы в #region
+ sb.Insert(0, "#region " + stub.Key + " Members" + newLine +
newLine);
+ sb.AppendLine("#endregion " + stub.Key + " Members" + newLine);
+ // Вставляем описание интерфейса в конец класса
+ var endLine = _ty.Location.EndLine;
+ var text = _source.GetLine(endLine);
+ indent = text.GetLiadingSpaces();
+ pt = new TextPoint(endLine, 1);
+ indent += pref.MakeIndentString();
+ //TODO: Этот код рассчитывает на то, что конец типа
распологается на отдельной строке.
+ // Надо бы сделать реализацию не закладывающуюся на это.
+ }
+
+ #endregion
+
+ sb.Insert(0, indent);
+ sb.Replace("\n", "\n" + indent);
+ TrimEnd(sb);
+
+ var inertLoc = new Location(_source.FileIndex, pt, pt);
+ var span = inertLoc.ToTextSpan();
+
+ editArray.Add(new EditSpan(span, sb.ToString()));
+ }
+ }
+
+ private StringBuilder MakeStubsForTypeMembers(IGrouping<MType.Class,
MemberImplInfo> stubInfos)
+ {
+ var writer = new System.IO.StringWriter();
+ var members = stubInfos.ToArray();
+ var isInterface = stubInfos.Key.IsInterface;
+ var ty = isInterface ? stubInfos.Key : _ty.GetMemType();
+
+ foreach (var memberImplInfo in members)
+ {
+ var member = memberImplInfo.Member;
+ var @explicit = memberImplInfo.Explicit;
+ var accessModifier = memberImplInfo.AccessModifier;
+ var implementationName = memberImplInfo.ImplementationName;
+
+ if (isInterface)
+ NUtils.GenerateMemberImplementation(writer, _source.FileIndex,
+ ty, member, @explicit,
accessModifier, implementationName);
+ else
+ {
+ var am = (member.Attributes | NemerleAttributes.Override)
+ & ~(NemerleAttributes.Abstract |
NemerleAttributes.Virtual);
+ var acessMods = am.ToString().ToLower().Replace(",", "");
+
+ NUtils.GenerateMemberImplementation(writer, _source.FileIndex,
+ ty, member, false,
acessMods, "");
+ }
+
+ writer.WriteLine();
+ }
+
+ return writer.GetStringBuilder();
}

+ #region Utils
+
static void TrimEnd(StringBuilder sb)
{
for (int i = sb.Length - 1; i > 0; i--)
@@ -310,5 +371,72 @@
}
}
}
+
+ private DataGridViewTextBoxColumn ImplementationNameColumn()
+ {
+ return
(DataGridViewTextBoxColumn)_grid.Columns["ImplementationName"];
+ }
+
+ private DataGridViewCheckBoxColumn ExplicitColumn()
+ {
+ return (DataGridViewCheckBoxColumn)_grid.Columns["Explicit"];
+ }
+
+ private DataGridViewComboBoxColumn AccessModifierColumn()
+ {
+ return (DataGridViewComboBoxColumn)_grid.Columns["AccessModifier"];
+ }
+
+ private static DataGridViewCell SignatureCell(DataGridViewRow row)
+ {
+ return row.Cells["Signature"];
+ }
+
+ private static string SignatureCellValue(DataGridViewRow row)
+ {
+ return (string)SignatureCell(row).Value;
+ }
+
+ private static DataGridViewCell ImplementationNameCell(DataGridViewRow
row)
+ {
+ return row.Cells["ImplementationName"];
+ }
+
+ private static string ImplementationNameCellValue(DataGridViewRow row)
+ {
+ return (string)ImplementationNameCell(row).Value;
+ }
+
+ private static DataGridViewCell AccessModifierCell(DataGridViewRow row)
+ {
+ return row.Cells["AccessModifier"];
+ }
+
+ private static string AccessModifierCellValue(DataGridViewRow row)
+ {
+ return (string)AccessModifierCell(row).Value;
+ }
+
+ private static DataGridViewCell ImplementCell(DataGridViewRow row)
+ {
+ return row.Cells["Implement"];
+ }
+
+ private static bool ImplementCellValue(DataGridViewRow row)
+ {
+ return (bool)ImplementCell(row).Value;
+ }
+
+ private static DataGridViewCell ExplicitCell(DataGridViewRow row)
+ {
+ return row.Cells["Explicit"];
+ }
+
+ private static bool ExplicitCellValue(DataGridViewRow row)
+ {
+ return (bool)ExplicitCell(row).Value;
+ }
+
+ #endregion
}
}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.resx
Mon Oct 26 02:38:15 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/GUI/ImplementMembersForm.resx
Tue Oct 27 16:04:20 2009
@@ -117,19 +117,19 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
- <metadata name="ItfMemberNameCol.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
+ <metadata name="SoutceName.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
- <metadata name="AddImplCol.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
+ <metadata name="Implement.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Explicit.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
- <metadata name="AccessMods.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
+ <metadata name="AccessModifier.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
- <metadata name="ImplName.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
+ <metadata name="ImplementationName.UserAddedColumn"
type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Signature.UserAddedColumn" type="System.Boolean,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089">
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/LanguageService/NemerleSource.cs
Mon Oct 26 02:38:15 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/LanguageService/NemerleSource.cs
Tue Oct 27 16:04:20 2009
@@ -9,12 +9,10 @@
using Nemerle.VisualStudio.Project;

using System.Collections.Generic;
-//using System.Collections;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System;
-using System.Reflection;

using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID;
using TopDeclaration = Nemerle.Compiler.Parsetree.TopDeclaration;
@@ -61,7 +59,7 @@
#region Properties

public DateTime LastDirtyTime { get; private set; }
- public new DateTime LastParseTime { get; private set; }
+ //public new DateTime LastParseTime { get; private set; }
public NemerleLanguageService Service { get; private set; }
public NemerleScanner Scanner { get; private set; }
public ProjectInfo ProjectInfo { get; private set; }
@@ -97,8 +95,8 @@

#region Fields

+ readonly List<RelocationRequest> _relocationRequestsQueue = new
List<RelocationRequest>();
int _fileIndex = -1;
- List<RelocationRequest> _relocationRequestsQueue = new
List<RelocationRequest>();
QuickTipInfoAsyncRequest _tipAsyncRequest;

#endregion
@@ -347,55 +345,56 @@
private GotoInfo[] TryGetGotoInfoForMemberFromSource(IMember member,
Location loc, CompileUnit cu)
{
Trace.Assert(member != null);
- var ty = member as Nemerle.Compiler.TypeInfo;
+ var ty = (TypeInfo)member;
var soughtIsType = ty != null;

if (ty == null)
+// ReSharper disable PossibleNullReferenceException
ty = member.DeclaringType;
+// ReSharper restore PossibleNullReferenceException

var td = FindTopDeclaration(ty, cu);

if (td == null)
return new GotoInfo[0];
- else if (soughtIsType)
+
+ if (soughtIsType)
return new[] { new GotoInfo(Location.GetFileName(cu.FileIndex),
td.NameLocation) };
- else
- {
- var name = member.Name;
- var file = Location.GetFileName(cu.FileIndex);
- var members = td.GetMembers().Where(m => string.Equals(m.Name,
name, StringComparison.Ordinal)).ToArray();
-
- if (members.Length == 1)
- return new[] { new GotoInfo(file, members[0].NameLocation) };
-
- var isProp = member is IProperty;
-
- members = td.GetMembers().Where(m => string.Equals(m.Name, name,
StringComparison.OrdinalIgnoreCase)
- // Ìàêðî [Accessor] ìîæåò èçìåíÿòü èìÿ ñâîéñòâà. Ó÷èòûâàåì ýòî...
- || (isProp && string.Equals(m.Name.Replace("_", ""), name,
StringComparison.OrdinalIgnoreCase))).ToArray();
-
- if (members.Length > 0)
- {
- if (loc.Column > 0)
- {
- var members2 = members.Where(m =>
m.Location.Contains(loc)).ToArray();
- if (members2.Length > 0)
- return members2.Select(m => new GotoInfo(file,
m.NameLocation)).ToArray();
- else
- return new[] { new GotoInfo(file, td.NameLocation) };
- }
- else if (members.Length == 1)
- return new[] { new GotoInfo(file, members[0].NameLocation) };
+
+ var name = member.Name;
+ var file = Location.GetFileName(cu.FileIndex);
+ var members = td.GetMembers().Where(m => string.Equals(m.Name, name,
StringComparison.Ordinal)).ToArray();
+
+ if (members.Length == 1)
+ return new[] { new GotoInfo(file, members[0].NameLocation) };
+
+ var isProp = member is IProperty;
+
+ members = td.GetMembers().Where(m => string.Equals(m.Name, name,
StringComparison.OrdinalIgnoreCase)
+ // Ìàêðî [Accessor] ìîæåò
èçìåíÿòü èìÿ ñâîéñòâà. Ó÷èòûâàåì ýòî...
+ || (isProp &&
string.Equals(m.Name.Replace("_", ""), name,
StringComparison.OrdinalIgnoreCase))).ToArray();
+
+ if (members.Length > 0)
+ {
+ if (loc.Column > 0)
+ {
+ var members2 = members.Where(m =>
m.Location.Contains(loc)).ToArray();
+ if (members2.Length > 0)
+ return members2.Select(m => new GotoInfo(file,
m.NameLocation)).ToArray();
else
- return FindBastMember(members, member).Select(m => new
GotoInfo(file, m.NameLocation)).ToArray();
- }
-
- // Èùåì ÷ëåí (ôóíêöèþ, ñâîéñòâî, ïîëå...)
- if (soughtIsType)
- return new[] { new GotoInfo(file, td.NameLocation) };
+ return new[] { new GotoInfo(file, td.NameLocation) };
+ }
+ else if (members.Length == 1)
+ return new[] { new GotoInfo(file, members[0].NameLocation) };
else
- return new GotoInfo[0];
- }
+ return FindBastMember(members, member).Select(m => new
GotoInfo(file, m.NameLocation)).ToArray();
+ }
+
+ // Èùåì ÷ëåí (ôóíêöèþ, ñâîéñòâî, ïîëå...)
+ if (soughtIsType)
+ return new[] { new GotoInfo(file, td.NameLocation) };
+ else
+ return new GotoInfo[0];
}

private ClassMember[] FindBastMember(ClassMember[] members, IMember
member)
Reply all
Reply to author
Forward
0 new messages