@@ -1905,46 +1905,64 @@ func (c *Checker) isBlockScopedNameDeclaredBeforeUse(declaration *ast.Node, usag
19051905}
19061906
19071907func (c *Checker) isUsedInFunctionOrInstanceProperty(usage *ast.Node, declaration *ast.Node, declContainer *ast.Node) bool {
1908- 	for current := usage; current != nil && current != declContainer; current = current.Parent {
1908+ 	return ast.FindAncestorOrQuit(usage, func(current *ast.Node) ast.FindAncestorResult {
1909+ 		if current == declContainer {
1910+ 			return ast.FindAncestorQuit
1911+ 		}
19091912		if ast.IsFunctionLike(current) {
1910- 			return ast.GetImmediatelyInvokedFunctionExpression(current) == nil
1913+ 			return ast.ToFindAncestorResult(ast. GetImmediatelyInvokedFunctionExpression(current) == nil) 
19111914		}
19121915		if ast.IsClassStaticBlockDeclaration(current) {
1913- 			return declaration.Pos() < usage.Pos()
1916+ 			return ast.ToFindAncestorResult( declaration.Pos() < usage.Pos() )
19141917		}
1915- 		if current.Parent != nil && ast.IsPropertyDeclaration(current.Parent) && current.Parent.Initializer() == current {
1916- 			if ast.IsStatic(current.Parent) {
1917- 				if ast.IsMethodDeclaration(declaration) {
1918- 					return true
1919- 				}
1920- 				if ast.IsPropertyDeclaration(declaration) && ast.GetContainingClass(usage) == ast.GetContainingClass(declaration) {
1921- 					propName := declaration.Name()
1922- 					if ast.IsIdentifier(propName) || ast.IsPrivateIdentifier(propName) {
1923- 						t := c.getTypeOfSymbol(c.getSymbolOfDeclaration(declaration))
1924- 						staticBlocks := core.Filter(declaration.Parent.Members(), ast.IsClassStaticBlockDeclaration)
1925- 						if c.isPropertyInitializedInStaticBlocks(propName, t, staticBlocks, declaration.Parent.Pos(), current.Pos()) {
1926- 							return true
1918+ 
1919+ 		if current.Parent != nil && ast.IsPropertyDeclaration(current.Parent) {
1920+ 			propertyDeclaration := current.Parent
1921+ 			initializerOfProperty := propertyDeclaration.Initializer() == current
1922+ 			if initializerOfProperty {
1923+ 				if ast.IsStatic(current.Parent) {
1924+ 					if ast.IsMethodDeclaration(declaration) {
1925+ 						return ast.FindAncestorTrue
1926+ 					}
1927+ 					if ast.IsPropertyDeclaration(declaration) && ast.GetContainingClass(usage) == ast.GetContainingClass(declaration) {
1928+ 						propName := declaration.Name()
1929+ 						if ast.IsIdentifier(propName) || ast.IsPrivateIdentifier(propName) {
1930+ 							t := c.getTypeOfSymbol(c.getSymbolOfDeclaration(declaration))
1931+ 							staticBlocks := core.Filter(declaration.Parent.Members(), ast.IsClassStaticBlockDeclaration)
1932+ 							if c.isPropertyInitializedInStaticBlocks(propName, t, staticBlocks, declaration.Parent.Pos(), current.Pos()) {
1933+ 								return ast.FindAncestorTrue
1934+ 							}
19271935						}
19281936					}
1929- 				}
1930- 			} else { 
1931- 				isDeclarationInstanceProperty :=  ast.IsPropertyDeclaration(declaration) && ! ast.IsStatic (declaration)
1932- 				if !isDeclarationInstanceProperty ||  ast.GetContainingClass(usage) != ast.GetContainingClass(declaration) { 
1933- 					return true 
1937+ 				} else { 
1938+ 					isDeclarationInstanceProperty := ast.IsPropertyDeclaration(declaration) && !ast.IsStatic(declaration) 
1939+ 					if ! isDeclarationInstanceProperty ||  ast.GetContainingClass(usage) !=  ast.GetContainingClass (declaration) { 
1940+ 						return  ast.FindAncestorTrue 
1941+ 					} 
19341942				}
19351943			}
19361944		}
1937- 		if current.Parent != nil && ast.IsDecorator(current.Parent) && current.Parent.AsDecorator().Expression == current {
1945+ 
1946+ 		if current.Parent != nil && ast.IsDecorator(current.Parent) {
19381947			decorator := current.Parent.AsDecorator()
1939- 			if ast.IsParameter(decorator.Parent) {
1940- 				return c.isUsedInFunctionOrInstanceProperty(decorator.Parent.Parent.Parent, declaration, declContainer)
1941- 			}
1942- 			if ast.IsMethodDeclaration(decorator.Parent) {
1943- 				return c.isUsedInFunctionOrInstanceProperty(decorator.Parent.Parent, declaration, declContainer)
1948+ 			if decorator.Expression == current {
1949+ 				if ast.IsParameter(decorator.Parent) {
1950+ 					if c.isUsedInFunctionOrInstanceProperty(decorator.Parent.Parent.Parent, declaration, declContainer) {
1951+ 						return ast.FindAncestorTrue
1952+ 					}
1953+ 					return ast.FindAncestorQuit
1954+ 				}
1955+ 				if ast.IsMethodDeclaration(decorator.Parent) {
1956+ 					if c.isUsedInFunctionOrInstanceProperty(decorator.Parent.Parent, declaration, declContainer) {
1957+ 						return ast.FindAncestorTrue
1958+ 					}
1959+ 					return ast.FindAncestorQuit
1960+ 				}
19441961			}
19451962		}
1946- 	}
1947- 	return false
1963+ 
1964+ 		return ast.FindAncestorFalse
1965+ 	}) != nil
19481966}
19491967
19501968func isImmediatelyUsedInInitializerOfBlockScopedVariable(declaration *ast.Node, usage *ast.Node, declContainer *ast.Node) bool {
0 commit comments