/// <summary> /// The goal here is to reduce the risk of name conflict between 2 classes /// added in different directories. This code does NOT garanty uniqueness. /// To garanty uniqueness, you should change this function to work with /// the language service to verify that the namespace+class generated does /// not conflict. /// </summary> /// <param name="fileFullPath">Full path to the new file</param> /// <returns>Namespace to use for the new file</returns> public string GetFileNamespace(string fileFullPath, ProjectNode node) { // Get base namespace from the project string namespce = node.GetProjectProperty("RootNamespace"); if (String.IsNullOrEmpty(namespce)) { namespce = Path.GetFileNameWithoutExtension(fileFullPath); } ; // If the item is added to a subfolder, the name space should reflect this. // This is done so that class names from 2 files with the same name but different // directories don't conflict. string relativePath = Path.GetDirectoryName(fileFullPath); string projectPath = Path.GetDirectoryName(node.GetMkDocument()); // Our project system only support adding files that are sibling of the project file or that are in subdirectories. if (String.Compare(projectPath, 0, relativePath, 0, projectPath.Length, true, CultureInfo.CurrentCulture) == 0) { relativePath = relativePath.Substring(projectPath.Length); } else { Debug.Fail("Adding an item to the project that is NOT under the project folder."); // We are going to use the full file path for generating the namespace } // Get the list of parts int index = 0; string[] pathParts; pathParts = relativePath.Split(Path.DirectorySeparatorChar); // Use a string builder with default size being the expected size StringBuilder result = new StringBuilder(namespce, namespce.Length + relativePath.Length + 1); // For each path part while (index < pathParts.Length) { string part = pathParts[index]; ++index; // This could happen if the path had leading/trailing slash, we want to ignore empty pieces if (String.IsNullOrEmpty(part)) { continue; } // If we reach here, we will be adding something, so add a namespace separator '.' result.Append('.'); // Make sure it starts with a letter if (!char.IsLetter(part, 0)) { result.Append('N'); } // Filter invalid namespace characters foreach (char c in part) { if (char.IsLetterOrDigit(c)) { result.Append(c); } } } return(result.ToString()); }
public virtual int get_Property(string pszProperty, out object pvar) { pvar = project.GetProjectProperty(pszProperty); return(VSConstants.S_OK); }
/// <summary> /// The goal here is to reduce the risk of name conflict between 2 classes /// added in different directories. This code does NOT garanty uniqueness. /// To garanty uniqueness, you should change this function to work with /// the language service to verify that the namespace+class generated does /// not conflict. /// </summary> /// <param name="fileFullPath">Full path to the new file</param> /// <returns>Namespace to use for the new file</returns> public string GetFileNamespace(string fileFullPath, ProjectNode node) { // Get base namespace from the project string namespce = node.GetProjectProperty("RootNamespace"); if (String.IsNullOrEmpty(namespce)) namespce = Path.GetFileNameWithoutExtension(fileFullPath); ; // If the item is added to a subfolder, the name space should reflect this. // This is done so that class names from 2 files with the same name but different // directories don't conflict. string relativePath = Path.GetDirectoryName(fileFullPath); string projectPath = Path.GetDirectoryName(node.GetMkDocument()); // Our project system only support adding files that are sibling of the project file or that are in subdirectories. if (String.Compare(projectPath, 0, relativePath, 0, projectPath.Length, true, CultureInfo.CurrentCulture) == 0) { relativePath = relativePath.Substring(projectPath.Length); } else { Debug.Fail("Adding an item to the project that is NOT under the project folder."); // We are going to use the full file path for generating the namespace } // Get the list of parts int index = 0; string[] pathParts; pathParts = relativePath.Split(Path.DirectorySeparatorChar); // Use a string builder with default size being the expected size StringBuilder result = new StringBuilder(namespce, namespce.Length + relativePath.Length + 1); // For each path part while (index < pathParts.Length) { string part = pathParts[index]; ++index; // This could happen if the path had leading/trailing slash, we want to ignore empty pieces if (String.IsNullOrEmpty(part)) continue; // If we reach here, we will be adding something, so add a namespace separator '.' result.Append('.'); // Make sure it starts with a letter if (!char.IsLetter(part, 0)) result.Append('N'); // Filter invalid namespace characters foreach (char c in part) { if (char.IsLetterOrDigit(c)) result.Append(c); } } return result.ToString(); }