/interpreter/tags/at2dist091109/src/edu/vub/at/exceptions/XTypeMismatch.java

http://ambienttalk.googlecode.com/ · Java · 102 lines · 28 code · 10 blank · 64 comment · 0 complexity · e8183efe26b7abf606f29e62711211bb MD5 · raw file

  1. /**
  2. * AmbientTalk/2 Project
  3. * XTypeMismatch.java created on Jul 13, 2006 at 9:43:54 PM
  4. * (c) Programming Technology Lab, 2006 - 2007
  5. * Authors: Tom Van Cutsem & Stijn Mostinckx
  6. *
  7. * Permission is hereby granted, free of charge, to any person
  8. * obtaining a copy of this software and associated documentation
  9. * files (the "Software"), to deal in the Software without
  10. * restriction, including without limitation the rights to use,
  11. * copy, modify, merge, publish, distribute, sublicense, and/or
  12. * sell copies of the Software, and to permit persons to whom the
  13. * Software is furnished to do so, subject to the following
  14. * conditions:
  15. *
  16. * The above copyright notice and this permission notice shall be
  17. * included in all copies or substantial portions of the Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  20. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  21. * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  22. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  23. * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  24. * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  25. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  26. * OTHER DEALINGS IN THE SOFTWARE.
  27. */
  28. package edu.vub.at.exceptions;
  29. import edu.vub.at.eval.Evaluator;
  30. import edu.vub.at.objects.ATObject;
  31. import edu.vub.at.objects.ATTypeTag;
  32. import edu.vub.at.objects.coercion.NativeTypeTags;
  33. /**
  34. * XTypeMismatch instances are thrown when a value conversion failed. Value conversions occur
  35. * when the interpreter expects arguments of a particular interface type (e.g. an ATClosure to
  36. * apply) and the passed argument has another type. The following cases can be distinguished:
  37. * <ul>
  38. * <li> The argument is of a different native ambienttalk type and therefore cannot be used.
  39. * In this case, an XTypeMismatch exception will be thrown.</li>
  40. * <li> The argument is an ambienttalk object. At this point, the coercer will attempt to
  41. * coerce the object into the correct type, which is possible only if the object has the
  42. * correct native type. Otherwise, an XTypeMismatch exception will be thrown.</li>
  43. * <li>The target type is a Java interface. The conversion automatically succeeds if the passed
  44. * argument is a JavaObject wrapper for an object which implements the interface. If the passed
  45. * argument is an ambienttalk object, the coercer will be able to dynamically synthetise a
  46. * proxy implementing the interface. If the argument is of a native ambienttalk type however,
  47. * an XTypeMismatch exception will be thrown.</li>
  48. * <li>The target type is a Java class. If the passed argument is not a JavaObject wrapper for
  49. * an instance of this class (or one of its subclasses), an XTypeMismatch exception will be
  50. * thrown.</li>
  51. * </ul>
  52. *
  53. * @author smostinc
  54. * @author tvcutsem
  55. */
  56. public class XTypeMismatch extends InterpreterException {
  57. private static final long serialVersionUID = -3135452124227872807L;
  58. private final ATObject failedObject_;
  59. private final Class expectedType_;
  60. /**
  61. * Creates a new type mismatch exception given the expected type and the object that could not be coerced to this type.
  62. * @param expectedType a Java Class denoting the type the object was being coerced into.
  63. * @param failedObject the ambienttalk value that could not be coerced into the correct type
  64. */
  65. public XTypeMismatch(Class expectedType, ATObject failedObject) {
  66. expectedType_ = expectedType;
  67. failedObject_ = failedObject;
  68. }
  69. /**
  70. * @return the ambienttalk value that could not be coerced into the correct type.
  71. */
  72. public ATObject getFailedObject() {
  73. return failedObject_;
  74. }
  75. /**
  76. * @return a Java Class denoting the type the object was being coerced into.
  77. */
  78. public Class getExpectedType() {
  79. return expectedType_;
  80. }
  81. /**
  82. * @return a textual description of the type mismatch exception.
  83. */
  84. public String getMessage() {
  85. String obj = Evaluator.toString(failedObject_);
  86. return "Type mismatch: expected " + Evaluator.valueNameOf(expectedType_)
  87. + ", given " + obj + " (type: " + Evaluator.valueNameOf(failedObject_.getClass())+ ")";
  88. }
  89. public ATTypeTag getType() {
  90. return NativeTypeTags._TYPEMISMATCH_;
  91. }
  92. }