Index: obsolete/Microsoft.VisualStudio.Project/TokenProcessor.cs |
diff --git a/obsolete/Microsoft.VisualStudio.Project/TokenProcessor.cs b/obsolete/Microsoft.VisualStudio.Project/TokenProcessor.cs |
deleted file mode 100644 |
index 6a24a6f4b12ce87c45dee445b26a98542e5fc239..0000000000000000000000000000000000000000 |
--- a/obsolete/Microsoft.VisualStudio.Project/TokenProcessor.cs |
+++ /dev/null |
@@ -1,489 +0,0 @@ |
-/// Copyright (c) Microsoft Corporation. All rights reserved. |
- |
-using System; |
-using System.Collections; |
-using System.Diagnostics; |
-using System.Diagnostics.CodeAnalysis; |
-using System.Globalization; |
-using System.IO; |
-using System.Text; |
- |
-namespace Microsoft.VisualStudio.Project |
-{ |
- /// <summary> |
- /// Replacement type |
- /// </summary> |
- public enum TokenReplaceType |
- { |
- ReplaceString, |
- ReplaceNumber, |
- ReplaceCode |
- } |
- |
- /// <summary> |
- /// Contain a number of functions that handle token replacement |
- /// </summary> |
- [CLSCompliant(false)] |
- public class TokenProcessor |
- { |
- #region fields |
- // Internal fields |
- private ArrayList tokenlist; |
- |
- |
- #endregion |
- |
- #region Initialization |
- /// <summary> |
- /// Constructor |
- /// </summary> |
- public TokenProcessor() |
- { |
- tokenlist = new ArrayList(); |
- } |
- |
- /// <summary> |
- /// Reset list of TokenReplacer entries |
- /// </summary> |
- public virtual void Reset() |
- { |
- tokenlist.Clear(); |
- } |
- |
- |
- /// <summary> |
- /// Add a replacement type entry |
- /// </summary> |
- /// <param name="token">token to replace</param> |
- /// <param name="replacement">replacement string</param> |
- public virtual void AddReplace(string token, string replacement) |
- { |
- tokenlist.Add(new ReplacePairToken(token, replacement)); |
- } |
- |
- /// <summary> |
- /// Add replace between entry |
- /// </summary> |
- /// <param name="tokenStart">Start token</param> |
- /// <param name="tokenEnd">End token</param> |
- [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "tokenid")] |
- public virtual void AddReplaceBetween(string tokenid, string tokenStart, string tokenEnd, string replacement) |
- { |
- tokenlist.Add(new ReplaceBetweenPairToken(tokenid, tokenStart, tokenEnd, replacement)); |
- } |
- |
- /// <summary> |
- /// Add a deletion entry |
- /// </summary> |
- /// <param name="tokenToDelete">Token to delete</param> |
- public virtual void AddDelete(string tokenToDelete) |
- { |
- tokenlist.Add(new DeleteToken(tokenToDelete)); |
- } |
- #endregion |
- |
- #region TokenProcessing |
- /// <summary> |
- /// For all known token, replace token with correct value |
- /// </summary> |
- /// <param name="source">File of the source file</param> |
- /// <param name="destination">File of the destination file</param> |
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily"), SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Untoken")] |
- public virtual void UntokenFile(string source, string destination) |
- { |
- if(string.IsNullOrEmpty(source)) |
- throw new ArgumentNullException("source"); |
- |
- if(string.IsNullOrEmpty(destination)) |
- throw new ArgumentNullException("destination"); |
- |
- // Make sure that the destination folder exists. |
- string destinationFolder = Path.GetDirectoryName(destination); |
- if(!Directory.Exists(destinationFolder)) |
- { |
- Directory.CreateDirectory(destinationFolder); |
- } |
- |
- //Open the file. Check to see if the File is binary or text. |
- // NOTE: This is not correct because GetBinaryType will return true |
- // only if the file is executable, not if it is a dll, a library or |
- // any other type of binary file. |
- |
- uint binaryType; |
- if(!NativeMethods.GetBinaryType(source, out binaryType)) |
- { |
- Encoding encoding = Encoding.Default; |
- string buffer = null; |
- // Create the reader to get the text. Note that we will default to ASCII as |
- // encoding if the file does not contains a different signature. |
- using(StreamReader reader = new StreamReader(source, Encoding.ASCII, true)) |
- { |
- // Get the content of the file. |
- buffer = reader.ReadToEnd(); |
- // Detect the encoding of the source file. Note that we |
- // can get the encoding only after a read operation is |
- // performed on the file. |
- encoding = reader.CurrentEncoding; |
- } |
- foreach(object pair in tokenlist) |
- { |
- if(pair is DeleteToken) |
- DeleteTokens(ref buffer, (DeleteToken)pair); |
- if(pair is ReplaceBetweenPairToken) |
- ReplaceBetweenTokens(ref buffer, (ReplaceBetweenPairToken)pair); |
- if(pair is ReplacePairToken) |
- ReplaceTokens(ref buffer, (ReplacePairToken)pair); |
- } |
- File.WriteAllText(destination, buffer, encoding); |
- } |
- else |
- File.Copy(source, destination); |
- |
- } |
- |
- /// <summary> |
- /// Replaces the tokens in a buffer with the replacement string |
- /// </summary> |
- /// <param name="buffer">Buffer to update</param> |
- /// <param name="tokenToReplace">replacement data</param> |
- public virtual void ReplaceTokens(ref string buffer, ReplacePairToken tokenToReplace) |
- { |
- buffer = buffer.Replace(tokenToReplace.Token, tokenToReplace.Replacement); |
- } |
- |
- /// <summary> |
- /// Deletes the token from the buffer |
- /// </summary> |
- /// <param name="buffer">Buffer to update</param> |
- /// <param name="tokenToDelete">token to delete</param> |
- public virtual void DeleteTokens(ref string buffer, DeleteToken tokenToDelete) |
- { |
- buffer = buffer.Replace(tokenToDelete.StringToDelete, string.Empty); |
- } |
- |
- /// <summary> |
- /// Replaces the token from the buffer between the provided tokens |
- /// </summary> |
- /// <param name="buffer">Buffer to update</param> |
- /// <param name="rpBetweenToken">replacement token</param> |
- public virtual void ReplaceBetweenTokens(ref string buffer, ReplaceBetweenPairToken rpBetweenToken) |
- { |
- string regularExp = rpBetweenToken.TokenStart + "[^" + rpBetweenToken.TokenIdentifier + "]*" + rpBetweenToken.TokenEnd; |
- buffer = System.Text.RegularExpressions.Regex.Replace(buffer, regularExp, rpBetweenToken.TokenReplacement); |
- } |
- |
- #endregion |
- |
- #region Guid generators |
- /// <summary> |
- /// Generates a string representation of a guid with the following format: |
- /// 0x01020304, 0x0506, 0x0708, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 |
- /// </summary> |
- /// <param name="value">Guid to be generated</param> |
- /// <returns>The guid as string</returns> |
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] |
- public string GuidToForm1(Guid value) |
- { |
- byte[] GuidBytes = value.ToByteArray(); |
- StringBuilder ResultingStr = new StringBuilder(80); |
- |
- // First 4 bytes |
- int i = 0; |
- int Number = 0; |
- for(i = 0; i < 4; ++i) |
- { |
- int CurrentByte = GuidBytes[i]; |
- Number += CurrentByte << (8 * i); |
- } |
- UInt32 FourBytes = (UInt32)Number; |
- ResultingStr.AppendFormat(CultureInfo.InvariantCulture, "0x{0}", FourBytes.ToString("X", CultureInfo.InvariantCulture)); |
- |
- // 2 chunks of 2 bytes |
- for(int j = 0; j < 2; ++j) |
- { |
- Number = 0; |
- for(int k = 0; k < 2; ++k) |
- { |
- int CurrentByte = GuidBytes[i++]; |
- Number += CurrentByte << (8 * k); |
- } |
- UInt16 TwoBytes = (UInt16)Number; |
- ResultingStr.AppendFormat(CultureInfo.InvariantCulture, ", 0x{0}", TwoBytes.ToString("X", CultureInfo.InvariantCulture)); |
- } |
- |
- // 8 chunks of 1 bytes |
- for(int j = 0; j < 8; ++j) |
- { |
- ResultingStr.AppendFormat(CultureInfo.InvariantCulture, ", 0x{0}", GuidBytes[i++].ToString("X", CultureInfo.InvariantCulture)); |
- } |
- |
- return ResultingStr.ToString(); |
- } |
- #endregion |
- |
- #region Helper Methods |
- /// <summary> |
- /// This function will accept a subset of the characters that can create an |
- /// identifier name: there are other unicode char that can be inside the name, but |
- /// this function will not allow. By now it can work this way, but when and if the |
- /// VSIP package will handle also languages different from english, this function |
- /// must be changed. |
- /// </summary> |
- /// <param name="c">Character to validate</param> |
- /// <returns>true if successful false otherwise</returns> |
- [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "c")] |
- protected static bool IsValidIdentifierChar(char c) |
- { |
- if((c >= 'a') && (c <= 'z')) |
- { |
- return true; |
- } |
- if((c >= 'A') && (c <= 'Z')) |
- { |
- return true; |
- } |
- if(c == '_') |
- { |
- return true; |
- } |
- if((c >= '0') && (c <= '9')) |
- { |
- return true; |
- } |
- |
- return false; |
- } |
- |
- /// <summary> |
- /// Verifies if the start character is valid |
- /// </summary> |
- /// <param name="c">Start character</param> |
- /// <returns>true if successful false otherwise</returns> |
- [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "c")] |
- protected static bool IsValidIdentifierStartChar(char c) |
- { |
- if(!IsValidIdentifierChar(c)) |
- { |
- return false; |
- } |
- if((c >= '0') && (c <= '9')) |
- { |
- return false; |
- } |
- |
- return true; |
- } |
- |
- /// <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> |
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] |
- 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(); |
- } |
- #endregion |
- |
- } |
- |
- /// <summary> |
- /// Storage classes for replacement tokens |
- /// </summary> |
- public class ReplacePairToken |
- { |
- /// <summary> |
- /// token string |
- /// </summary> |
- private string token; |
- |
- /// <summary> |
- /// Replacement string |
- /// </summary> |
- private string replacement; |
- |
- /// <summary> |
- /// Constructor |
- /// </summary> |
- /// <param name="token">replaceable token</param> |
- /// <param name="replacement">replacement string</param> |
- public ReplacePairToken(string token, string replacement) |
- { |
- this.token = token; |
- this.replacement = replacement; |
- } |
- |
- /// <summary> |
- /// Token that needs to be replaced |
- /// </summary> |
- public string Token |
- { |
- get { return token; } |
- } |
- /// <summary> |
- /// String to replace the token with |
- /// </summary> |
- public string Replacement |
- { |
- get { return replacement; } |
- } |
- } |
- |
- /// <summary> |
- /// Storage classes for token to be deleted |
- /// </summary> |
- public class DeleteToken |
- { |
- /// <summary> |
- /// String to delete |
- /// </summary> |
- private string token; |
- |
- /// <summary> |
- /// Constructor |
- /// </summary> |
- /// <param name="token">Deletable token.</param> |
- public DeleteToken(string token) |
- { |
- this.token = token; |
- } |
- |
- /// <summary> |
- /// Token marking the end of the block to delete |
- /// </summary> |
- public string StringToDelete |
- { |
- get { return token; } |
- } |
- } |
- |
- /// <summary> |
- /// Storage classes for string to be deleted between tokens to be deleted |
- /// </summary> |
- public class ReplaceBetweenPairToken |
- { |
- /// <summary> |
- /// Token start |
- /// </summary> |
- private string tokenStart; |
- |
- /// <summary> |
- /// End token |
- /// </summary> |
- private string tokenEnd; |
- |
- /// <summary> |
- /// Replacement string |
- /// </summary> |
- private string replacement; |
- |
- /// <summary> |
- /// Token identifier string |
- /// </summary> |
- private string tokenidentifier; |
- |
- /// <summary> |
- /// Constructor |
- /// </summary> |
- /// <param name="blockStart">Start token</param> |
- /// <param name="blockEnd">End Token</param> |
- /// <param name="replacement">Replacement string.</param> |
- [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "tokenid")] |
- public ReplaceBetweenPairToken(string tokenid, string blockStart, string blockEnd, string replacement) |
- { |
- tokenStart = blockStart; |
- tokenEnd = blockEnd; |
- this.replacement = replacement; |
- tokenidentifier = tokenid; |
- } |
- |
- /// <summary> |
- /// Token marking the begining of the block to delete |
- /// </summary> |
- public string TokenStart |
- { |
- get { return tokenStart; } |
- } |
- |
- /// <summary> |
- /// Token marking the end of the block to delete |
- /// </summary> |
- public string TokenEnd |
- { |
- get { return tokenEnd; } |
- } |
- |
- /// <summary> |
- /// Token marking the end of the block to delete |
- /// </summary> |
- public string TokenReplacement |
- { |
- get { return replacement; } |
- } |
- |
- /// <summary> |
- /// Token Identifier |
- /// </summary> |
- public string TokenIdentifier |
- { |
- get { return tokenidentifier; } |
- } |
- } |
-} |