1//
2//  ANTLRTreeException.m
3//  ANTLR
4//
5//  Created by Kay Röpke on 24.10.2006.
6// [The "BSD licence"]
7// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
8// All rights reserved.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions
12// are met:
13// 1. Redistributions of source code must retain the above copyright
14//    notice, this list of conditions and the following disclaimer.
15// 2. Redistributions in binary form must reproduce the above copyright
16//    notice, this list of conditions and the following disclaimer in the
17//    documentation and/or other materials provided with the distribution.
18// 3. The name of the author may not be used to endorse or promote products
19//    derived from this software without specific prior written permission.
20//
21// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32
33#import "ANTLRTreeException.h"
34
35
36@implementation ANTLRTreeException
37
38+ (id) newException:(id<ANTLRBaseTree>)theOldRoot newRoot:(id<ANTLRBaseTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
39{
40	return [[ANTLRTreeException alloc] initWithOldRoot:theOldRoot newRoot:theNewRoot stream:aStream];
41}
42
43- (id) initWithOldRoot:(id<ANTLRBaseTree>)theOldRoot newRoot:(id<ANTLRBaseTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
44{
45	if ((self = [super initWithStream:aStream reason:@"The new root has more than one child. Cannot make it the root node."]) != nil ) {
46		[self setOldRoot:theOldRoot];
47		[self setNewRoot:theNewRoot];
48	}
49	return self;
50}
51
52- (void) dealloc
53{
54#ifdef DEBUG_DEALLOC
55    NSLog( @"called dealloc in ANTLRTreeException" );
56#endif
57	[self setOldRoot:nil];
58	[self setNewRoot:nil];
59	[super dealloc];
60}
61
62- (void) setNewRoot:(id<ANTLRBaseTree>)aTree
63{
64	if (newRoot != aTree) {
65		[aTree retain];
66		if ( newRoot ) [newRoot release];
67		newRoot = aTree;
68	}
69}
70
71- (void) setOldRoot:(id<ANTLRBaseTree>)aTree
72{
73	if (oldRoot != aTree) {
74		[aTree retain];
75		if ( oldRoot ) [oldRoot release];
76		oldRoot = aTree;
77	}
78}
79
80- (NSString *) description
81{
82	 return [NSMutableString stringWithFormat:@"%@ old root: <%@> new root: <%@>", [super description], [oldRoot treeDescription], [newRoot treeDescription]];
83}
84
85@end
86