The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ JScriptException

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using Microsoft.JScript.Vsa;
  19.     using System;
  20.     using System.Runtime.InteropServices;
  21.     using System.Runtime.Serialization;
  22.     using System.Resources;
  23.     using System.Security.Permissions;
  24.     using System.Globalization;
  25.     using Microsoft.Vsa;
  26.     using System.Text;
  27.    
  28.     //-------------------------------------------------------------------------------------------------------
  29.     // JScriptException
  30.     //
  31.     // An error in JScript goes to a CLR host/program in the form of a JScriptException. However a
  32.     // JScriptException is not always thrown. In fact a JScriptException is also a IVsaError and thus it can be
  33.     // passed to the host through IVsaSite.OnCompilerError(IVsaError error).
  34.     // When a JScriptException is not a wrapper for some other object (usually either a COM+ exception or
  35.     // any value thrown in a JScript throw statement) it takes a JSError value.
  36.     // The JSError enum is defined in JSError.cs. When introducing a new type of error perform
  37.     // the following four steps:
  38.     // 1- Add the error in the JSError enum (JSError.cs)
  39.     // 2- Update GetErrorType() to return a value from the ErrorType enum (in ErrorConstructor) for the
  40.     // error you just defined. GetErrorType() is a map form JSError to a JScript object in the Error
  41.     // hierarchy
  42.     // 3- Update Microsoft.JScript.txt with the US English error message
  43.     // 4- Update Severity.
  44.     //-------------------------------------------------------------------------------------------------------
  45.     [Serializable()]
  46.     public class JScriptException : ApplicationException, IVsaFullErrorInfo
  47.     {
  48.         internal object value;
  49.         [NonSerialized()]
  50.         internal Context context;
  51.         internal bool isError;
  52.         static internal readonly string ContextStringDelimiter = ";;";
  53.         private int code;
  54.         // This is same as base.HResult. We have this so that the debuugger can get the
  55.         // error code without doing a func-eval ( to evaluate the HResult property )
  56.         // We don't expect this to be called usually, but add it in case of serialization.
  57.         public JScriptException() : this(JSError.NoError)
  58.         {
  59.         }
  60.        
  61.         public JScriptException(string m) : this(m, null)
  62.         {
  63.         }
  64.        
  65.         public JScriptException(string m, Exception e) : this(m, e, null)
  66.         {
  67.         }
  68.        
  69.         public JScriptException(JSError errorNumber) : this(errorNumber, null)
  70.         {
  71.         }
  72.        
  73.         internal JScriptException(JSError errorNumber, Context context)
  74.         {
  75.             this.value = Missing.Value;
  76.             this.context = context;
  77.             this.code = this.HResult = unchecked((int)(2148139008u + (int)errorNumber));
  78.         }
  79.        
  80.         internal JScriptException(object value, Context context)
  81.         {
  82.             this.value = value;
  83.             this.context = context;
  84.             this.code = this.HResult = unchecked((int)(2148139008u + (int)JSError.UncaughtException));
  85.         }
  86.        
  87.         internal JScriptException(Exception e, Context context) : this(null, e, context)
  88.         {
  89.         }
  90.        
  91.         internal JScriptException(string m, Exception e, Context context) : base(m, e)
  92.         {
  93.             this.value = e;
  94.             this.context = context;
  95.             if (e is StackOverflowException) {
  96.                 this.code = this.HResult = unchecked((int)(2148139008u + (int)JSError.OutOfStack));
  97.                 this.value = Missing.Value;
  98.             }
  99.             else if (e is OutOfMemoryException) {
  100.                 this.code = this.HResult = unchecked((int)(2148139008u + (int)JSError.OutOfMemory));
  101.                 this.value = Missing.Value;
  102.             }
  103.             else {
  104.                 int hr = System.Runtime.InteropServices.Marshal.GetHRForException(e);
  105.                 if ((hr & 4294901760u) == 2148139008u && System.Enum.IsDefined(typeof(JSError), hr & 65535)) {
  106.                     this.code = this.HResult = hr;
  107.                     this.value = Missing.Value;
  108.                 }
  109.                 else
  110.                     this.code = this.HResult = unchecked((int)(2148139008u + (int)JSError.UncaughtException));
  111.             }
  112.         }
  113.        
  114.         protected JScriptException(SerializationInfo info, StreamingContext context) : base(info, context)
  115.         {
  116.             this.code = this.HResult = info.GetInt32("Code");
  117.             this.value = Missing.Value;
  118.             this.isError = info.GetBoolean("IsError");
  119.         }
  120.        
  121.         public string SourceMoniker {
  122.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  123.             get {
  124.                 if (this.context != null)
  125.                     return this.context.document.documentName;
  126.                 else
  127.                     return "no source";
  128.             }
  129.         }
  130.        
  131.         public int StartColumn {
  132.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  133.             get { return this.Column; }
  134.         }
  135.        
  136.         public int Column {
  137.             get {
  138.                 if (this.context != null)
  139.                     return this.context.StartColumn + this.context.document.startCol + 1;
  140.                 else
  141.                     return 0;
  142.             }
  143.         }
  144.        
  145.         // We have this method simply to have the same link demand on it as the interface
  146.         // method has and avoid a FXCOP warning. The Description property itself cannot have
  147.         // a link demand on it since it is used by the JScript Error object's Description property
  148.         string IVsaError.Description {
  149.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  150.             get { return this.Description; }
  151.         }
  152.        
  153.         public string Description {
  154.             get { return this.Message; }
  155.         }
  156.        
  157.         public int EndLine {
  158.             get {
  159.                 if (this.context != null)
  160.                     return this.context.EndLine + this.context.document.startLine - this.context.document.lastLineInSource;
  161.                 else
  162.                     return 0;
  163.             }
  164.         }
  165.        
  166.         public int EndColumn {
  167.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  168.             get {
  169.                 if (this.context != null)
  170.                     return this.context.EndColumn + this.context.document.startCol + 1;
  171.                 else
  172.                     return 0;
  173.             }
  174.         }
  175.        
  176.         // We have this method simply to have the same link demand on it as the interface
  177.         // method has and avoid a FXCOP warning. The Number property itself cannot have
  178.         // a link demand on it since it is used by the JScript Error object's Number property
  179.         int IVsaError.Number {
  180.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  181.             get { return this.Number; }
  182.         }
  183.        
  184.         public int Number {
  185.             get { return this.ErrorNumber; }
  186.         }
  187.        
  188.         public int ErrorNumber {
  189.             get { return this.HResult; }
  190.         }
  191.        
  192.         internal ErrorType GetErrorType()
  193.         {
  194.             int ec = this.HResult;
  195.             if ((ec & 4294901760u) != 2148139008u)
  196.                 return ErrorType.OtherError;
  197.             switch ((JSError)(ec & 65535)) {
  198.                 case JSError.AbstractWithBody:
  199.                     return ErrorType.SyntaxError;
  200.                 case JSError.AmbiguousConstructorCall:
  201.                     return ErrorType.ReferenceError;
  202.                 case JSError.AmbiguousMatch:
  203.                     return ErrorType.ReferenceError;
  204.                 case JSError.ArrayLengthConstructIncorrect:
  205.                     return ErrorType.RangeError;
  206.                 case JSError.ArrayLengthAssignIncorrect:
  207.                     return ErrorType.RangeError;
  208.                 case JSError.AssemblyAttributesMustBeGlobal:
  209.                     return ErrorType.SyntaxError;
  210.                 case JSError.AssignmentToReadOnly:
  211.                     return ErrorType.ReferenceError;
  212.                 case JSError.BadBreak:
  213.                     return ErrorType.SyntaxError;
  214.                 case JSError.BadContinue:
  215.                     return ErrorType.SyntaxError;
  216.                 case JSError.BadHexDigit:
  217.                     return ErrorType.SyntaxError;
  218.                 case JSError.BadLabel:
  219.                     return ErrorType.SyntaxError;
  220.                 case JSError.BadReturn:
  221.                     return ErrorType.SyntaxError;
  222.                 case JSError.BadSwitch:
  223.                     return ErrorType.SyntaxError;
  224.                 case JSError.BadFunctionDeclaration:
  225.                     return ErrorType.SyntaxError;
  226.                 case JSError.BadPropertyDeclaration:
  227.                     return ErrorType.SyntaxError;
  228.                 case JSError.BadVariableDeclaration:
  229.                     return ErrorType.SyntaxError;
  230.                 case JSError.BooleanExpected:
  231.                     return ErrorType.TypeError;
  232.                 case JSError.CannotInstantiateAbstractClass:
  233.                     return ErrorType.TypeError;
  234.                 case JSError.CannotNestPositionDirective:
  235.                     return ErrorType.SyntaxError;
  236.                 case JSError.CannotReturnValueFromVoidFunction:
  237.                     return ErrorType.TypeError;
  238.                 case JSError.CantAssignThis:
  239.                     return ErrorType.ReferenceError;
  240.                 case JSError.CcInvalidElif:
  241.                     return ErrorType.SyntaxError;
  242.                 case JSError.CcInvalidElse:
  243.                     return ErrorType.SyntaxError;
  244.                 case JSError.CcInvalidEnd:
  245.                     return ErrorType.SyntaxError;
  246.                 case JSError.CcOff:
  247.                     return ErrorType.SyntaxError;
  248.                 case JSError.CircularDefinition:
  249.                     return ErrorType.SyntaxError;
  250.                 case JSError.ClashWithProperty:
  251.                     return ErrorType.SyntaxError;
  252.                 case JSError.ClassNotAllowed:
  253.                     return ErrorType.SyntaxError;
  254.                 case JSError.ConstructorMayNotHaveReturnType:
  255.                     return ErrorType.SyntaxError;
  256.                 case JSError.DateExpected:
  257.                     return ErrorType.TypeError;
  258.                 case JSError.DifferentReturnTypeFromBase:
  259.                     return ErrorType.TypeError;
  260.                 case JSError.DoesNotHaveAnAddress:
  261.                     return ErrorType.ReferenceError;
  262.                 case JSError.DupDefault:
  263.                     return ErrorType.SyntaxError;
  264.                 case JSError.DuplicateMethod:
  265.                     return ErrorType.TypeError;
  266.                 case JSError.DuplicateNamedParameter:
  267.                     return ErrorType.ReferenceError;
  268.                 case JSError.EnumeratorExpected:
  269.                     return ErrorType.TypeError;
  270.                 case JSError.ErrEOF:
  271.                     return ErrorType.SyntaxError;
  272.                 case JSError.ExpectedAssembly:
  273.                     return ErrorType.SyntaxError;
  274.                 case JSError.ExpressionExpected:
  275.                     return ErrorType.SyntaxError;
  276.                 case JSError.FractionOutOfRange:
  277.                     return ErrorType.RangeError;
  278.                 case JSError.FunctionExpected:
  279.                     return ErrorType.TypeError;
  280.                 case JSError.IllegalAssignment:
  281.                     return ErrorType.ReferenceError;
  282.                 case JSError.IllegalChar:
  283.                     return ErrorType.SyntaxError;
  284.                 case JSError.IllegalEval:
  285.                     return ErrorType.EvalError;
  286.                 case JSError.ImpossibleConversion:
  287.                     return ErrorType.TypeError;
  288.                 case JSError.InstanceNotAccessibleFromStatic:
  289.                     return ErrorType.ReferenceError;
  290.                 case JSError.InvalidBaseTypeForEnum:
  291.                     return ErrorType.TypeError;
  292.                 case JSError.InvalidCall:
  293.                     return ErrorType.TypeError;
  294.                 case JSError.InvalidCustomAttribute:
  295.                     return ErrorType.TypeError;
  296.                 case JSError.InvalidCustomAttributeArgument:
  297.                     return ErrorType.TypeError;
  298.                 case JSError.InvalidCustomAttributeClassOrCtor:
  299.                     return ErrorType.TypeError;
  300.                 case JSError.InvalidDebugDirective:
  301.                     return ErrorType.SyntaxError;
  302.                 case JSError.InvalidElse:
  303.                     return ErrorType.SyntaxError;
  304.                 case JSError.InvalidPositionDirective:
  305.                     return ErrorType.SyntaxError;
  306.                 case JSError.InvalidPrototype:
  307.                     return ErrorType.TypeError;
  308.                 case JSError.ItemNotAllowedOnExpandoClass:
  309.                     return ErrorType.SyntaxError;
  310.                 case JSError.KeywordUsedAsIdentifier:
  311.                     return ErrorType.SyntaxError;
  312.                 case JSError.MemberInitializerCannotContainFuncExpr:
  313.                     return ErrorType.SyntaxError;
  314.                 case JSError.MissingConstructForAttributes:
  315.                     return ErrorType.SyntaxError;
  316.                 case JSError.MissingNameParameter:
  317.                     return ErrorType.ReferenceError;
  318.                 case JSError.MoreNamedParametersThanArguments:
  319.                     return ErrorType.ReferenceError;
  320.                 case JSError.MustBeEOL:
  321.                     return ErrorType.SyntaxError;
  322.                 case JSError.MustProvideNameForNamedParameter:
  323.                     return ErrorType.ReferenceError;
  324.                 case JSError.IncorrectNumberOfIndices:
  325.                     return ErrorType.ReferenceError;
  326.                 case JSError.NeedArrayObject:
  327.                     return ErrorType.TypeError;
  328.                 case JSError.NeedCompileTimeConstant:
  329.                     return ErrorType.ReferenceError;
  330.                 case JSError.NeedInterface:
  331.                     return ErrorType.TypeError;
  332.                 case JSError.NeedInstance:
  333.                     return ErrorType.ReferenceError;
  334.                 case JSError.NeedType:
  335.                     return ErrorType.TypeError;
  336.                 case JSError.NestedInstanceTypeCannotBeExtendedByStatic:
  337.                     return ErrorType.ReferenceError;
  338.                 case JSError.NoAt:
  339.                     return ErrorType.SyntaxError;
  340.                 case JSError.NoCatch:
  341.                     return ErrorType.SyntaxError;
  342.                 case JSError.NoCcEnd:
  343.                     return ErrorType.SyntaxError;
  344.                 case JSError.NoColon:
  345.                     return ErrorType.SyntaxError;
  346.                 case JSError.NoComma:
  347.                     return ErrorType.SyntaxError;
  348.                 case JSError.NoCommaOrTypeDefinitionError:
  349.                     return ErrorType.SyntaxError;
  350.                 case JSError.NoCommentEnd:
  351.                     return ErrorType.SyntaxError;
  352.                 case JSError.NoConstructor:
  353.                     return ErrorType.TypeError;
  354.                 case JSError.NoEqual:
  355.                     return ErrorType.SyntaxError;
  356.                 case JSError.NoIdentifier:
  357.                     return ErrorType.SyntaxError;
  358.                 case JSError.NoLabel:
  359.                     return ErrorType.SyntaxError;
  360.                 case JSError.NoLeftParen:
  361.                     return ErrorType.SyntaxError;
  362.                 case JSError.NoLeftCurly:
  363.                     return ErrorType.SyntaxError;
  364.                 case JSError.NoMemberIdentifier:
  365.                     return ErrorType.SyntaxError;
  366.                 case JSError.NonStaticWithTypeName:
  367.                     return ErrorType.ReferenceError;
  368.                 case JSError.NoRightBracket:
  369.                     return ErrorType.SyntaxError;
  370.                 case JSError.NoRightBracketOrComma:
  371.                     return ErrorType.SyntaxError;
  372.                 case JSError.NoRightCurly:
  373.                     return ErrorType.SyntaxError;
  374.                 case JSError.NoRightParen:
  375.                     return ErrorType.SyntaxError;
  376.                 case JSError.NoRightParenOrComma:
  377.                     return ErrorType.SyntaxError;
  378.                 case JSError.NoSemicolon:
  379.                     return ErrorType.SyntaxError;
  380.                 case JSError.NoSuchMember:
  381.                     return ErrorType.ReferenceError;
  382.                 case JSError.NoSuchStaticMember:
  383.                     return ErrorType.ReferenceError;
  384.                 case JSError.NotIndexable:
  385.                     return ErrorType.TypeError;
  386.                 case JSError.NotAccessible:
  387.                     return ErrorType.ReferenceError;
  388.                 case JSError.NotAnExpandoFunction:
  389.                     return ErrorType.ReferenceError;
  390.                 case JSError.NotCollection:
  391.                     return ErrorType.TypeError;
  392.                 case JSError.NotConst:
  393.                     return ErrorType.SyntaxError;
  394.                 case JSError.NotInsideClass:
  395.                     return ErrorType.SyntaxError;
  396.                 case JSError.NoWhile:
  397.                     return ErrorType.SyntaxError;
  398.                 case JSError.NumberExpected:
  399.                     return ErrorType.TypeError;
  400.                 case JSError.ObjectExpected:
  401.                     return ErrorType.TypeError;
  402.                 case JSError.OLENoPropOrMethod:
  403.                     return ErrorType.TypeError;
  404.                 case JSError.OnlyClassesAllowed:
  405.                     return ErrorType.SyntaxError;
  406.                 case JSError.OnlyClassesAndPackagesAllowed:
  407.                     return ErrorType.SyntaxError;
  408.                 case JSError.PackageExpected:
  409.                     return ErrorType.SyntaxError;
  410.                 case JSError.ParamListNotLast:
  411.                     return ErrorType.SyntaxError;
  412.                 case JSError.PrecisionOutOfRange:
  413.                     return ErrorType.RangeError;
  414.                 case JSError.PropertyLevelAttributesMustBeOnGetter:
  415.                     return ErrorType.ReferenceError;
  416.                 case JSError.RegExpExpected:
  417.                     return ErrorType.TypeError;
  418.                 case JSError.RegExpSyntax:
  419.                     return ErrorType.SyntaxError;
  420.                 case JSError.ShouldBeAbstract:
  421.                     return ErrorType.SyntaxError;
  422.                 case JSError.StaticMissingInStaticInit:
  423.                     return ErrorType.SyntaxError;
  424.                 case JSError.StaticRequiresTypeName:
  425.                     return ErrorType.ReferenceError;
  426.                 case JSError.StringExpected:
  427.                     return ErrorType.TypeError;
  428.                 case JSError.SuperClassConstructorNotAccessible:
  429.                     return ErrorType.ReferenceError;
  430.                 case JSError.SyntaxError:
  431.                     return ErrorType.SyntaxError;
  432.                 case JSError.TooFewParameters:
  433.                     return ErrorType.TypeError;
  434.                 case JSError.TooManyTokensSkipped:
  435.                     return ErrorType.SyntaxError;
  436.                 case JSError.TypeCannotBeExtended:
  437.                     return ErrorType.ReferenceError;
  438.                 case JSError.TypeMismatch:
  439.                     return ErrorType.TypeError;
  440.                 case JSError.UndeclaredVariable:
  441.                     return ErrorType.ReferenceError;
  442.                 case JSError.UndefinedIdentifier:
  443.                     return ErrorType.ReferenceError;
  444.                 case JSError.UnexpectedSemicolon:
  445.                     return ErrorType.SyntaxError;
  446.                 case JSError.UnreachableCatch:
  447.                     return ErrorType.SyntaxError;
  448.                 case JSError.UnterminatedString:
  449.                     return ErrorType.SyntaxError;
  450.                 case JSError.URIEncodeError:
  451.                     return ErrorType.URIError;
  452.                 case JSError.URIDecodeError:
  453.                     return ErrorType.URIError;
  454.                 case JSError.VBArrayExpected:
  455.                     return ErrorType.TypeError;
  456.                 case JSError.WriteOnlyProperty:
  457.                     return ErrorType.ReferenceError;
  458.                 case JSError.WrongDirective:
  459.                     return ErrorType.SyntaxError;
  460.                 case JSError.BadModifierInInterface:
  461.                     return ErrorType.SyntaxError;
  462.                 case JSError.VarIllegalInInterface:
  463.                     return ErrorType.SyntaxError;
  464.                 case JSError.InterfaceIllegalInInterface:
  465.                     return ErrorType.SyntaxError;
  466.                 case JSError.NoVarInEnum:
  467.                     return ErrorType.SyntaxError;
  468.                 case JSError.EnumNotAllowed:
  469.                     return ErrorType.SyntaxError;
  470.                 case JSError.PackageInWrongContext:
  471.                     return ErrorType.SyntaxError;
  472.                 case JSError.CcInvalidInDebugger:
  473.                     return ErrorType.SyntaxError;
  474.                 case JSError.TypeNameTooLong:
  475.                     return ErrorType.SyntaxError;
  476.             }
  477.             return ErrorType.OtherError;
  478.         }
  479.        
  480.         [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
  481.         public override void GetObjectData(SerializationInfo info, StreamingContext context)
  482.         {
  483.             if (info == null)
  484.                 throw new ArgumentNullException("info");
  485.             base.GetObjectData(info, context);
  486.             info.AddValue("IsError", this.isError);
  487.             info.AddValue("Code", this.code);
  488.         }
  489.        
  490.         public int Line {
  491.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  492.             get {
  493.                 if (this.context != null)
  494.                     return this.context.StartLine + this.context.document.startLine - this.context.document.lastLineInSource;
  495.                 else
  496.                     return 0;
  497.             }
  498.         }
  499.        
  500.         public string LineText {
  501.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  502.             get {
  503.                 if (this.context != null)
  504.                     return this.context.source_string;
  505.                 else
  506.                     return "";
  507.             }
  508.         }
  509.        
  510.         static internal string Localize(string key, CultureInfo culture)
  511.         {
  512.             return JScriptException.Localize(key, null, culture);
  513.         }
  514.        
  515.         static internal string Localize(string key, string context, CultureInfo culture)
  516.         {
  517.             try {
  518.                 ResourceManager rm = new ResourceManager("Microsoft.JScript", typeof(JScriptException).Module.Assembly);
  519.                 string localizedString = rm.GetString(key, culture);
  520.                 if (localizedString != null) {
  521.                     // locate context/no-context string delimiter
  522.                     int splitAt = localizedString.IndexOf(ContextStringDelimiter);
  523.                     if (splitAt == -1) {
  524.                         // there is no context-specific string
  525.                         return localizedString;
  526.                     }
  527.                     else if (context == null) {
  528.                         // splitAt is one character past the end of the no-context string
  529.                         return localizedString.Substring(0, splitAt);
  530.                     }
  531.                     else {
  532.                         // splitAt is two characters before the beginning of the context string
  533.                         return String.Format(culture, localizedString.Substring(splitAt + 2), context);
  534.                     }
  535.                 }
  536.             }
  537.             catch (MissingManifestResourceException) {
  538.             }
  539.             return key;
  540.         }
  541.        
  542.         public override string Message {
  543.             get {
  544.                 if (this.value is Exception) {
  545.                     Exception e = (Exception)this.value;
  546.                     string result = e.Message;
  547.                     if (result != null && result.Length > 0)
  548.                         return result;
  549.                     else {
  550.                         return e.ToString();
  551.                     }
  552.                 }
  553.                 string code = (this.HResult & 65535).ToString(CultureInfo.InvariantCulture);
  554.                 CultureInfo culture = null;
  555.                 if (this.context != null && this.context.document != null) {
  556.                     VsaEngine engine = this.context.document.engine;
  557.                     if (engine != null)
  558.                         culture = engine.ErrorCultureInfo;
  559.                 }
  560.                 if (this.value is ErrorObject) {
  561.                     string result = ((ErrorObject)this.value).Message;
  562.                     if (result != null && result.Length > 0)
  563.                         return result;
  564.                     else
  565.                         return Localize("No description available", culture) + ": " + code;
  566.                 }
  567.                 else if (this.value is string) {
  568.                     switch (((JSError)(this.HResult & 65535))) {
  569.                         case JSError.CannotBeAbstract:
  570.                         case JSError.Deprecated:
  571.                         case JSError.DifferentReturnTypeFromBase:
  572.                         case JSError.DuplicateName:
  573.                         case JSError.HidesAbstractInBase:
  574.                         case JSError.HidesParentMember:
  575.                         case JSError.InvalidCustomAttributeTarget:
  576.                         case JSError.ImplicitlyReferencedAssemblyNotFound:
  577.                         case JSError.MustImplementMethod:
  578.                         case JSError.NoSuchMember:
  579.                         case JSError.NoSuchType:
  580.                         case JSError.NoSuchStaticMember:
  581.                         case JSError.NotIndexable:
  582.                         case JSError.TypeCannotBeExtended:
  583.                         case JSError.TypeMismatch:
  584.                         case JSError.InvalidResource:
  585.                         case JSError.IncompatibleAssemblyReference:
  586.                         case JSError.InvalidAssemblyKeyFile:
  587.                         case JSError.TypeNameTooLong:
  588.                             return Localize(code, (string)this.value, culture);
  589.                         default:
  590.                             return (string)this.value;
  591.                     }
  592.                 }
  593.                 // special case some errors with contextual information
  594.                 if (this.context != null) {
  595.                     switch (((JSError)(this.HResult & 65535))) {
  596.                         case JSError.AmbiguousBindingBecauseOfWith:
  597.                         case JSError.AmbiguousBindingBecauseOfEval:
  598.                         case JSError.AssignmentToReadOnly:
  599.                         case JSError.DuplicateName:
  600.                         case JSError.InstanceNotAccessibleFromStatic:
  601.                         case JSError.KeywordUsedAsIdentifier:
  602.                         case JSError.NeedInstance:
  603.                         case JSError.NonStaticWithTypeName:
  604.                         case JSError.NotAccessible:
  605.                         case JSError.NotDeletable:
  606.                         case JSError.NotMeantToBeCalledDirectly:
  607.                         case JSError.ObjectExpected:
  608.                         case JSError.StaticRequiresTypeName:
  609.                         case JSError.UndeclaredVariable:
  610.                         case JSError.UndefinedIdentifier:
  611.                         case JSError.VariableLeftUninitialized:
  612.                         case JSError.VariableMightBeUnitialized:
  613.                             return Localize(code, this.context.GetCode(), culture);
  614.                     }
  615.                 }
  616.                 return Localize(((int)(this.HResult & 65535)).ToString(CultureInfo.InvariantCulture), culture);
  617.             }
  618.         }
  619.        
  620.         public int Severity {
  621.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  622.             get {
  623.                 //guide: 0 == there will be a run-time error if this code executes
  624.                 // 1 == the programmer probably did not intend to do this
  625.                 // 2 == this can lead to problems in the future.
  626.                 // 3 == this can lead to performance problems
  627.                 // 4 == this is just not right.
  628.                 int ec = this.HResult;
  629.                 if ((ec & 4294901760u) != 2148139008u)
  630.                     return 0;
  631.                 if (!this.isError) {
  632.                     switch ((JSError)(ec & 65535)) {
  633.                         case JSError.AmbiguousBindingBecauseOfWith:
  634.                             return 4;
  635.                         case JSError.AmbiguousBindingBecauseOfEval:
  636.                             return 4;
  637.                         case JSError.ArrayMayBeCopied:
  638.                             return 1;
  639.                         case JSError.AssignmentToReadOnly:
  640.                             return 1;
  641.                         case JSError.BadOctalLiteral:
  642.                             return 1;
  643.                         case JSError.BadWayToLeaveFinally:
  644.                             return 3;
  645.                         case JSError.BaseClassIsExpandoAlready:
  646.                             return 1;
  647.                         case JSError.Deprecated:
  648.                             return 2;
  649.                         case JSError.DifferentReturnTypeFromBase:
  650.                             return 1;
  651.                         case JSError.DuplicateName:
  652.                             return 1;
  653.                         case JSError.DupVisibility:
  654.                             return 1;
  655.                         case JSError.GetAndSetAreInconsistent:
  656.                             return 1;
  657.                         case JSError.HidesParentMember:
  658.                             return 1;
  659.                         case JSError.IncompatibleVisibility:
  660.                             return 1;
  661.                         case JSError.KeywordUsedAsIdentifier:
  662.                             return 2;
  663.                         case JSError.NewNotSpecifiedInMethodDeclaration:
  664.                             return 1;
  665.                         case JSError.NotDeletable:
  666.                             return 1;
  667.                         case JSError.NotMeantToBeCalledDirectly:
  668.                             return 1;
  669.                         case JSError.OctalLiteralsAreDeprecated:
  670.                             return 2;
  671.                         case JSError.PossibleBadConversion:
  672.                             return 1;
  673.                         case JSError.PossibleBadConversionFromString:
  674.                             return 4;
  675.                         case JSError.ShouldBeAbstract:
  676.                             return 1;
  677.                         case JSError.StringConcatIsSlow:
  678.                             return 3;
  679.                         case JSError.SuspectAssignment:
  680.                             return 1;
  681.                         case JSError.SuspectLoopCondition:
  682.                             return 1;
  683.                         case JSError.SuspectSemicolon:
  684.                             return 1;
  685.                         case JSError.TooFewParameters:
  686.                             return 1;
  687.                         case JSError.TooManyParameters:
  688.                             return 1;
  689.                         case JSError.UndeclaredVariable:
  690.                             return 3;
  691.                         case JSError.UselessAssignment:
  692.                             return 1;
  693.                         case JSError.UselessExpression:
  694.                             return 1;
  695.                         case JSError.VariableLeftUninitialized:
  696.                             return 3;
  697.                         case JSError.VariableMightBeUnitialized:
  698.                             return 3;
  699.                         case JSError.IncompatibleAssemblyReference:
  700.                             return 1;
  701.                     }
  702.                 }
  703.                 return 0;
  704.             }
  705.         }
  706.        
  707.         public IVsaItem SourceItem {
  708.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  709.             get {
  710.                 if (this.context != null)
  711.                     return this.context.document.sourceItem;
  712.                 else
  713.                     throw new NoContextException();
  714.                
  715.             }
  716.         }
  717.        
  718.         public override string StackTrace {
  719.             get {
  720.                 if (this.context == null)
  721.                     return this.Message + Environment.NewLine + base.StackTrace;
  722.                 StringBuilder result = new StringBuilder();
  723.                 Context c = this.context;
  724.                
  725.                 // Append the "filename: line number" error string
  726.                 string fileName = c.document.documentName;
  727.                 if (fileName != null && fileName.Length > 0)
  728.                     result.Append(fileName + ": ");
  729.                 CultureInfo culture = null;
  730.                 if (this.context != null && this.context.document != null) {
  731.                     VsaEngine engine = this.context.document.engine;
  732.                     if (engine != null)
  733.                         culture = engine.ErrorCultureInfo;
  734.                 }
  735.                 result.Append(Localize("Line", culture));
  736.                 result.Append(' ');
  737.                 result.Append(c.StartLine);
  738.                 // report the error
  739.                 result.Append(" - ");
  740.                 result.Append(Localize("Error", culture));
  741.                 result.Append(": ");
  742.                 result.Append(this.Message);
  743.                 result.Append(Environment.NewLine);
  744.                
  745.                 if (c.document.engine != null) {
  746.                     // Append the stack trace
  747.                     Stack callContextStack = c.document.engine.Globals.CallContextStack;
  748.                     for (int i = 0int n = callContextStack.Size(); i < n; i++) {
  749.                         CallContext cctx = (CallContext)callContextStack.Peek(i);
  750.                         result.Append(" ");
  751.                         result.Append(Localize("at call to", culture));
  752.                         result.Append(cctx.FunctionName());
  753.                         result.Append(' ');
  754.                         result.Append(Localize("in line", culture));
  755.                         result.Append(": ");
  756.                         result.Append(cctx.sourceContext.EndLine);
  757.                     }
  758.                 }
  759.                 return result.ToString();
  760.             }
  761.         }
  762.        
  763.     }
  764.    
  765.     [Serializable()]
  766.     public class NoContextException : ApplicationException
  767.     {
  768.         public NoContextException() : base(JScriptException.Localize("No Source Context available", CultureInfo.CurrentUICulture))
  769.         {
  770.         }
  771.        
  772.         public NoContextException(string m) : base(m)
  773.         {
  774.         }
  775.        
  776.         public NoContextException(string m, Exception e) : base(m, e)
  777.         {
  778.         }
  779.        
  780.         protected NoContextException(SerializationInfo s, StreamingContext c) : base(s, c)
  781.         {
  782.         }
  783.     }
  784.    
  785. }

Developer Fusion